Unity shader: Bank BRDF

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 }

效果如下:

转载于:https://www.cnblogs.com/foxianmo/p/4732606.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值