码迷,mamicode.com
首页 > 编程语言 > 详细

Unity shader: Bank BRDF

时间:2015-08-15 16:22:16      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:

Back BRDF是一种 模拟 金属表面 的 各向异性 光泽的经验模型,具体公式参照 GPU 编程与CG 语言之阳春白雪下里巴人 中120页的公式(10-14)

 1 Shader "Custom/Bank-BRDF" {
 2     Properties {
 3         _AmbiColor ("Main Color", Color) = (1, 1, 1, 1)
 4         _Ak ("Ambient Coef", float) = 1
 5         _DiffColor ("Diff Color", Color) = (1, 1, 1, 1)
 6         _Dk ("Diff Coef", float) = 1
 7         _SpecColor ("Spec Color", Color) = (1, 1, 1, 1)
 8         _Sk ("Sk", float) = 1
 9         _Sp ("Sp", Range(0, 5)) = 1
10     }
11 
12     SubShader {
13         Pass {
14             CGPROGRAM
15             #include "UnityCG.cginc"
16             #pragma vertex vert
17             #pragma fragment frag
18 
19             float4 _AmbiColor;
20             float _Ak;
21             float4 _DiffColor;
22             float _Dk;
23             float4 _SpecColor;
24             float _Sk;
25             float _Sp;
26 
27             struct v2f {
28                 float4 pos : POSITION;
29                 float3 normal : TEXCOORD0;
30                 float3 light : TEXCOORD1;
31                 float3 view : TEXCOORD2;
32                 float3 targent : TEXCOORD3;
33             };
34 
35             v2f vert(appdata_base v) {
36                 v2f o;
37                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
38                 o.normal = v.normal;
39                 o.light = ObjSpaceLightDir(v.vertex);
40                 o.view = ObjSpaceViewDir(v.vertex);
41                 o.targent = cross(v.normal, o.view);
42 
43                 return o;
44             }
45 
46             float4 frag(v2f i) : COLOR {
47                 float3 l = normalize(i.light);
48                 float3 t = normalize(i.targent);
49                 float3 v = normalize(i.view);
50                 float3 n = normalize(i.normal);
51 
52                 float lt = dot(l, t);
53                 float vt = dot(v, t);
54                 float nl = dot(n, l);
55                 float nv = dot(n, v);
56 
57                 float4 ambi = _AmbiColor * _Ak;
58                 float4 diff = _Dk * _DiffColor * saturate(nl);
59 
60                 if (nl <= 0 || nv <= 0)
61                     return ambi + diff;
62 
63                 float p = sqrt(1 - lt * lt) * sqrt(1 - vt * vt) - lt * vt;
64                 float f = _Sk * pow(p, _Sp);
65                 float spec = f * _SpecColor * saturate(dot(l, n));
66 
67                 return ambi + diff + spec;
68             }
69             ENDCG
70         }
71     } 
72     FallBack "Diffuse"
73 }

效果如下:

技术分享

Unity shader: Bank BRDF

标签:

原文地址:http://www.cnblogs.com/foxianmo/p/4732606.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!