Phong 式高光反射模型
一、来历和原理
二、公式
高光反射光光照颜色 = 光照的颜色 * 材质高光反射的颜色 * max(0,标准化后观察方向向量 ·标准化后的反射方法) 幂
- 标准化后观察方向·标准化后反射方向 ---> cosθ
- 幂 代表光泽度 余弦值取 n 次幂
三、如何再 Shader 中获取公式中的关键信息
| 观察者的位置(摄像机的位置) |
_WorldSpaceCameraPos |
| 相对于法向量的反射向量 |
reflect(入射向量,顶点法线向量)--返回值:反射向量 |
| 指数幂 |
pow(底数,指数)---返回值:计算结果 |
四、顶点着色器的实现
1.实现步骤
- 属性声明(材质高光反射的颜色,光泽度)
- 渲染标签 Tags 的设置 将 LightMode 光照模式 设置为 ForwardBase 向前渲染(该模式通常用于不透明物体的基本渲染)
- 引用内置文件 "UnityCG.cginc" "UnityCG.cginc"
- 结构体声明
- 基本逻辑的实现
2.实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| Shader "Unlit/Specular" { Properties { _SpecularColor("SpecularColor",Color) = (1,1,1,1) _SpecularNum("SpecularNum",Range(0,20)) = 0.5 } SubShader { Tags { "LightMode"="ForWardBase" }
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "UnityCG.cginc" #include "Lighting.cginc" fixed4 _SpecularColor; float _SpecularNum;
struct v2f { float4 pos:POSITION; fixed3 color:COLOR; };
v2f vert (appdata_base v) { v2f v2fData; v2fData.pos = UnityObjectToClipPos(v.vertex);
float3 worldPos = mul(UNITY_MATRIX_M,v.vertex); float3 viewDir = _WorldSpaceCameraPos.xyz - worldPos; viewDir = normalize(viewDir); float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); float3 normal = UnityObjectToWorldNormal(v.normal); float3 reflectDir = reflect(-lightDir,normal);
fixed3 color = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0,dot(viewDir,reflectDir)),_SpecularNum); v2fData.color = color; return v2fData; }
fixed4 frag (v2f i) : SV_Target { return fixed4(i.color.rgb,1); } ENDCG } } }
|
3.实例效果

五、顶点着色器的实现
1.实现步骤
- 属性声明(材质高光反射的颜色,光泽度)
- 渲染标签 Tags 的设置 将 LightMode 光照模式 设置为 ForwardBase 向前渲染(该模式通常用于不透明物体的基本渲染)
- 引用内置文件 "UnityCG.cginc" "UnityCG.cginc"
- 结构体声明
- 基本逻辑的实现
2.代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| Shader "Unlit/SpecularF" { Properties { _SpecularColor("SpacularColor",Color) = (1,1,1,1) _SpecularNum("SpecularNum",Range(0,20)) = 1 } SubShader {
Pass { Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" struct v2f { float4 pos:SV_POSITION; float3 normal:NORMAL; float3 wPos:TEXCOORD0;
}; v2f vert (appdata_base v) { v2f data; data.pos = UnityObjectToClipPos(v.vertex); data.normal = UnityObjectToWorldNormal(v.normal); data.wPos = mul(unity_ObjectToWorld,v.vertex).xyz;
return data; }
fixed4 _SpecularColor; float _SpecularNum;
fixed4 frag (v2f i) : SV_Target {
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.wPos);
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); float3 reflectDir = reflect(-lightDir,i.normal).xyz;
fixed3 color = _SpecularColor.rgb * _LightColor0.rgb *pow(max(0,dot(viewDir,reflectDir)),_SpecularNum);
return fixed4(color.rgb,1); } ENDCG } } }
|
3.实现效果
