您的位置:首页 > 移动开发 > Unity3D

Unity shader学习之高光反射光照模型

2017-06-28 09:37 417 查看
高光反射光照模型的公式如下:

  Cspecular = Clight * mspecular * max(0, dot(v, r))gloss

要计算高光反射需要知道4个参数:入射光线颜色Cspecular,材质高光反射系数gloss,视角方向v和反射方向r

其中r可由cg函数reflect(i, n)求得。

转载请注明出处:http://www.cnblogs.com/jietian331/p/7088297.html

逐顶点高光反射shader如下:

1 Shader "Custom/Specular Fragment-Level"
2 {
3     Properties
4     {
5         _Diffuse ("Diffuse Color", Color) = (1,1,1,1)
6         _Specular ("Specular Color", Color) = (1,1,1,1)
7         _Gloss ("Gloss", Range(8, 256)) = 8
8     }
9     SubShader
10     {
11         Tags { "RenderType"="Opaque" }
12         LOD 100
13
14         Pass
15         {
16             Tags { "LightMode"="ForwardBase" }
17
18             CGPROGRAM
19             #pragma vertex vert
20             #pragma fragment frag
21
22             #include "UnityCG.cginc"
23             #include "Lighting.cginc"
24
25             struct appdata
26             {
27                 float4 vertex : POSITION;
28                 float3 normal : NORMAL;
29             };
30
31             struct v2f
32             {
33                 float4 vertex : SV_POSITION;
34                 float3 worldPos : TEXCOORD0;
35                 float3 worldNormal : TEXCOORD1;
36             };
37
38             fixed4 _Diffuse;
39             fixed4 _Specular;
40             float _Gloss;
41
42             v2f vert (appdata v)
43             {
44                 v2f o;
45                 o.vertex = UnityObjectToClipPos(v.vertex);
46                 o.worldNormal = UnityObjectToWorldNormal(v.normal);
47                 o.worldPos = mul(unity_ObjectToWorld, v.vertex);
48                 return o;
49             }
50
51             fixed4 frag (v2f i) : SV_Target
52             {
53                 // specular
54                 float3 worldNormal = normalize(i.worldNormal);
55                 float3 lightDir = UnityWorldSpaceLightDir(i.worldPos);
56                 lightDir = normalize(lightDir);
57                 float3 refLightDir = reflect(-lightDir, worldNormal);
58                 refLightDir = normalize(refLightDir);
59                 float3 viewDir = UnityWorldSpaceViewDir(i.worldPos);
60                 viewDir = normalize(viewDir);
61                 float d = max(0, dot(refLightDir, viewDir));
62                 float3 spec = _LightColor0.rgb * _Specular.rgb * pow(d, _Gloss);
63
64                 // diffuse
65                 float3 diff = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(lightDir, worldNormal));
66
67                 float3 c = spec + diff + UNITY_LIGHTMODEL_AMBIENT.rgb;
68                 return fixed4(c, 1);
69             }
70             ENDCG
71         }
72     }
73 }


Custom/Specular Fragment-Level

效果分别如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: