本节内容介绍PhongModel(也就是上文说的反射光的计算模型),采用的计算方法是BlinPhong(也即是用视线方向V+光源方向L的和,与N做点积,随后幂化得到高光反射系数)下图采用了csdn博文http://blog.csdn.net/u010133610/article/details/52206654中的一张插图。

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

第1.1步:新建shader和material,正如我前面的教程所说的那样。

第1.2步:代码如下:

▼代码开始
Shader "Custom/Learn2" {
Properties {
_Color ("Color", Color) = (,,,)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf PhongModel
sampler2D _MainTex; struct Input {
float2 uv_MainTex;
}; fixed4 _Color; void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
} inline float4 LightingPhongModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
{
float4 col; //首先是漫反射系数,取法和入射光的近似程度(余弦值)作为系数
float diffuseF = max(, dot(s.Normal, lightDir)); //H表示研究点指向光源的方向(lightDir) + 研究点指向眼镜的方向(viewDir),用H和法的近似程度的幂作为高光反射系数
float3 H = normalize(lightDir + viewDir);
float specBase = max(, dot(s.Normal, H));
float specF= pow(specBase, ); //漫反射+镜面高光 模型
col.rgb = s.Albedo * _LightColor0 * diffuseF * atten +_LightColor0*specF;
col.a = s.Alpha;
return col;
} ENDCG
}
FallBack "Diffuse"
}

▲代码结束

第1.3步:应用一张纹理,然后查看效果:

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

以下记录了一些实验:

当上文中的900修改为以下值时对应的效果:

float specF= pow(specBase, 1);

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

float specF= pow(specBase, 10);

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

float specF= pow(specBase, 100);

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

float specF= pow(specBase, 1000);

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

float specF= pow(specBase, 10000);

Unity Shader入门教程(四)反射光斑的实现-LMLPHP

——小江村儿的文杰 [email protected] 2017年7月28日21:54:01

04-14 00:48