Unity Shader: Cook-Torrance

// 原公式来自于 GPU 编程与CG 语言之阳春白雪下里巴人 的 114页的(10-11)。公式中的分母少了个 (N·L),具体看 113 页的公式(10-3)。

 1 Shader "Custom/Cook-Torrance" {
 2     Properties {
 3         _MainTex("Main Tex", 2D) = "white" {}
 4         _AmbiColor ("Main Color", Color) = (1, 1, 1, 1)
 5         _Ak ("Ambient Coef", float) = 1
 6         _DiffColor ("Diff Color", Color) = (1, 1, 1, 1)
 7         _Dk ("Diff Coef", float) = 1
 8         _SpecColor ("Spec Color", Color) = (1, 1, 1, 1)
 9         _Sk ("Sk", float) = 1
10         // _Sp ("Sp", Range(0, 5)) = 1
11         _m ("m", Range(0, 1)) = 0.1
12         _f0 ("f0", Range(0, 1)) = 0.5
13     }
14
15     SubShader {
16         Tags { "RenderType"="Opaque" }
17         LOD 200
18         Pass {
19             CGPROGRAM
20             #include "UnityCG.cginc"
21             #pragma vertex vert
22             #pragma fragment frag
23
24             float4 _AmbiColor;
25             float _Ak;
26             float4 _DiffColor;
27             float _Dk;
28             float4 _SpecColor;
29             float _Sk;
30             // float _Sp;
31             float _m;
32             float _f0;
33
34             sampler2D _MainTex;
35
36             struct v2f {
37                 float4 pos : POSITION;
38                 float2 uv : TEXCOORD0;
39                 float3 light : TEXCOORD1;
40                 float3 view : TEXCOORD2;
41                 float3 normal : TEXCOORD3;
42             };
43
44             v2f vert(appdata_base v) {
45                 v2f o;
46                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
47                 o.normal = v.normal;
48                 o.light = ObjSpaceLightDir(v.vertex);
49                 o.view = ObjSpaceViewDir(v.vertex);
50                 o.uv = v.texcoord;
51
52                 return o;
53             }
54
55             float4 frag(v2f i) : COLOR {
56                 float3 l = normalize(i.light);
57                 float3 v = normalize(i.view);
58                 float3 n = normalize(i.normal);
59                 float3 h = normalize(l + v);
60
61                 float vh = dot(v, h);
62                 float nh = dot(n, h);
63                 float nl = dot(n, l);
64                 float nv = dot(n, v);
65
66                 float4 t = tex2D(_MainTex, i.uv);
67
68                 float4 ambi = _AmbiColor * _Ak;
69                 float4 diff = _DiffColor * _Dk * saturate(nl);
70
71                 if (nh <= 0 || nl <= 0)
72                     return t * ambi + diff;
73
74                 float F = _f0 + (1 - _f0) * (1 - pow(vh, 5));
75                 float D = exp((nh * nh - 1) / (_m * _m * nh * nh)) / (_m * _m * pow(nh, 4));
76                 float G = min(1, min(2 * nh * nl / vh, 2 * nh * nv / vh));
77
78                 float R = F * D * G / (nv * nl);
79
80                 float spec = _SpecColor * _Sk * R * nl;
81
82                 return t * ambi + diff + spec;
83             }
84
85             ENDCG
86         }
87     }
88     FallBack "Diffuse"
89 }

效果如下:

时间: 2024-11-04 11:11:07

Unity Shader: Cook-Torrance的相关文章

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,

[Unity&#160;Shader笔记]渲染路径--Forward渲染路径

[Unity Shader笔记]渲染路径--Forward渲染路径 (2014-04-22 20:08:25) 转载▼ 标签: shader unity renderingpath forward 游戏 分类: UnityShader *ForwardBase.ForwardAdd的LightMode只能运行在Came为Forward.DeferredLighting的渲染模式下 *ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity忽视掉 * Forward

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

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

Unity shader教程-第一课:写shader和应用shader的流程

这是我们Unity shader(着色器)教程的第一课,在这节课中,你会学到怎么样来用程序来编写一个在Unity中能使用的着色器:漫反射着色器.这节课的内容主要让我们熟悉创建shader和应用shader的流程. 准备工作: 安装Unity版本4.6以上 创建一个新的工程 菜单GameObject | 3D Object | Plane创建出一个平面,作为我们的地面 菜单GameObject | 3D Object | Sphere创建出球来,反复多次创建多个 注意: 1. 创建地面后选中该物体

《Unity Shader 与 计算机图形学》第二章

提示:本篇将会非常长~ 本系列文章分为 硬件 编程入门 工程实践 上一篇 主要介绍了GPU的特征工作原理 以及渲染的底层流程 其实对于新架构而言还有所不同 Shader描述了如何渲染物体的信息,包括: Texture Setup.纹理设置 Material Property.材质设置 Render State.渲染状态 Blend Setup.混合设置 Pixel Shader.像素着色 Vertex Shader.定点着色 Render Target Setup 渲染目标设置 Shader并不

Unity Shader入门

这篇文章是我在学习蛮牛的一套关于Shader教程(http://www.unitytrain.cn/course/96)后的简单总结,个人感觉这套教程并不是以高级Shader编程为目的的,更像是授人以渔的宗旨.下面我会分为三个部分:Shader简述.图形学基础,Cg简介为大家介绍Shader的相关内容,也算是做一个总结. 一:Shader简述     a.先说一下GPU与CPU的区别,简单说:GPU主要负责跟显示相关的数据处理,而CPU主要负责操作系统和应用程序.为什么不把显示相关的数据直接交给

Unity Shader编程(1)漫反射着色

Unity Shader编程(1)漫反射着色 在Unity中创建如下工程: 我们把Shader拖到Material上.Meterial拖到Cube上.这就完成了一个着色器的着色过程. Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaq

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

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