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 }

效果如下:

时间: 2024-10-11 23:59:22

Unity shader: Bank BRDF的相关文章

Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propagation Model),目的为了得出移动信号的传播损耗.当时是基于普通的PC实时运算,非常非常耗时–如北京五环内的传播模型渲染GIS图用了超过20分钟. 光照模型来源有2类: 一类是基于学术论文的算法,如Lambert模型.Phong模型. 另一类基于算法的变种–在实际生产实践中修正得到的模型,

【我的书】Unity Shader的书 — 目录(2015.09.04更新)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的

【我的书】Unity Shader的书 — 目录(2016.1.29更新)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的

【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shader的艰难,在群里也见了非常多人提出的问题. 我认为学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么优点呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader刚開始学习的人,但要

【我的书】Unity Shader的书 — 目录(实时更新中)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的

Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交:一些光线被物体吸收了,而另一些光线被散射到其他方向. 最后,摄像机吸收了一些光,产生了一张图像. 在光学中,我们使用辐照度来量化光.对于平行光来说,它的辐照度可通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到.在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和l不垂直的,我们可以

unity shader序列帧动画代码,顺便吐槽一下unity shader系统

http://www.cnblogs.com/hellohuan/archive/2014/01/10/3512784.html 一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Shader "HELLOHUAN/Hello_Sequence" { Properties { _Color ("Main Color", C

【Unity Shader编程】之十四 边缘发光Shader(Rim Shader)的两种实现形态

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader来编写边缘发光Shader. 一.最终实现的效果

Unity Shader入门教程(一)

参考文献:http://www.360doc.com/content/13/0923/15/12282510_316492286.shtml Unity Shader是着色器,将纹理.网格信息输入,得到材质的一段程序,具体是个什么东西,还需要亲自实践才知道.一个Unity大神推荐我:如果要学计算机图形编程(游戏编程的基础),可以先学习UnityShader,往后再学习OpenGL和DX.不说废话,依我的风格,都是直接看实例,笔者的教程偏向于傻瓜式的,应该适合入门. 前提:安装了Unity和VS,