Unity Shaders and Effects Cookbook (3-1) 使用Unity 内置的Specular Lighting - BlinnPhong
2016-04-01 02:11
471 查看
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
一张图来解释下镜面高光
左侧是灯泡,灯泡发出光,到达顶点片段,然后被反射出来为 R 。
我们站在右侧观察,如果眼睛正好位于 光 的反射 的方向,即 眼睛位于 R 方向上,那么这个时候我们看到的光肯定是最强的。
随着眼睛 和 反射光 R 的夹角越大,那我们观察到Speculer Lighting 镜面光强度越小。
以上引自之前写的 OpenglES Specular Lighting (镜面高光) 一文
http://blog.csdn.net/huutu/article/details/50279969
在GL中写 Specular Ligting 不是很复杂,然而在Unity 之中却更加简单。
Unity为我们提供了一个内置的 高光 光照模型函数 BlinnPhong ,我们只要指定光照模型为 BlinnPhone 就可以获得高光的效果。
下面来尝试。
首先新建一个Shader,一个Material,Material 中选择新创建的 Shader。
然后修改Shader 代码。
我们要使用 BlinnPhong 光照模型,但是请注意,BlinnPhong 光照模型 有一个内置变量 _SpecColor, 一定要在 Propertices 块中声明这个变量。
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint("Diffuse Tint",Color)=(1,1,1,1) //漫反射
_SpecColor("Specular Color",Color)=(1,1,1,1) //高光颜色
_SpecPower("Specular Power",Range(0,1))=0.5 //高光强度
然后在 CGPROGRAM 中声明我们自定义的其它 变量
sampler2D _MainTex;
float4 _MainTint;
float _SpecPower;
然后指定光照模型为 BlinnPhong
#pragma surface surf BlinnPhong转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 完整Shader代码如下:
Shader "CookBookShaders/Build-in Specular"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint("Diffuse Tint",Color)=(1,1,1,1)
_SpecColor("Specular Color",Color)=(1,1,1,1)
_SpecPower("Specular Power",Range(0,1))=0.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
//注意:这里指定了采用哪种光照模型,这里指定为 Build-in 的BlinnPhong;
CGPROGRAM
#pragma surface surf BlinnPhong
//注意 : _SpecColor 是Unity Build-in变量,无需自己在SubShader中声明变量,只需在 Properties块中声明该变量;就是说变量是内置的,但是这个变量在编辑器中显示什么名字是我们来指定的(之前说过Propertices块中声明的变量是编辑器和CG的桥梁、中间件)
sampler2D _MainTex;
float4 _MainTint;
float _SpecPower;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
half4 c = tex2D (_MainTex, IN.uv_MainTex)*_MainTint;
o.Specular=_SpecPower; //传递到 BlinnPhong 光照模型函数中。
o.Gloss=1.0; //光滑度,用来控制高光的清晰度,值越大 越清晰,比如一块慢慢生锈的铁,就可以用Gloss慢慢减小,实现高光越来越弱的效果
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
看看默认材质 和 Specular 材质的对比
示例工程下载:
http://pan.baidu.com/s/1nu7KLyL
相关文章推荐
- 【Unity3D游戏开发】性能优化之Texture图片空间和内存占用分析(三七)
- 【Unity3D游戏开发】性能优化之如何将包大小减少到极致(三六)
- Unity 博客精选(持续更新)
- Thinking in Unity3D:基于物理着色(PBS)的材质系统
- unity androidSDK和IOS内购
- [Unity官方文档翻译]Import Settings unity资源中的导入设置
- 关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题
- unity vs支持shader的插件
- NUGI中摄像机问题
- unity 链接 eclipse 调试
- Unity中透明材质物体渲染到RenderTexture的问题
- unity3d Physics
- 【unity小技巧之一】使Debug.Log支持颜色等富文本信息
- unity3d的playmaker插件使用教程,五、进入区域改变平台颜色
- unity 鼠标指示NavMeshAgent移动
- unity GPU优化
- Unity 之 Light : Light Probe
- Unity 3D:控制相机旋转、移动、缩放等功能
- unity, inspector listview
- unity3d js 和web js的区别