Unity3dShader – 模拟光照

  • A+
所属分类:UnityShader 原创文章

新建场景1

加入一个球体,把平行光删除掉

Unity3dShader - 模拟光照 Unity3dShader - 模拟光照

新建材质和Shader    (LightColor)


打开Shader,把原来的代码删除

编写一个顶点片段型的着色器

编写Shader的目录和名字

Unity3dShader - 模拟光照

编写属性

Unity3dShader - 模拟光照

Unity3dShader - 模拟光照

_color灯光的颜色,_direct灯光的方向,_intensity灯光的强度


编写子Shader

Unity3dShader - 模拟光照

这里定义了一个pass通道

就是让数据经过这个通道进行加工

使用CG语言编写    (CGPROGRAM  ...................ENDCG)

声明顶点处理程序 #pragma vertex vert   (vert为一个函数)

声明片段处理程序   #pragma fragment frag   (frag为一个函数)

包含Unity的库文件,因为等下要使用Unity的变换矩阵


声明属性和保存数据的结构体

Unity3dShader - 模拟光照

在CG程序中,要使用Properties定义的属性

需要再声明一下,名字也要相同

然后定义一下要保存数据的结构体

因为要模拟光照

所以这里需要顶点位置和法向量


顶点处理函数

Unity3dShader - 模拟光照

这里的UNITY_MATRIX_MVP是刚刚引入Unity文件所定义的

它是个世界视图投影于一身的变换矩阵

保存处理过的顶点信息和法线信息并返回

然后传输到下一个处理程序(片段)


片段处理程序

真正的光照模拟在这里计算

Unity3dShader - 模拟光照

先将光照翻转(反正要翻,不然就翻,不知道为啥)

将光照方向和顶点法线单位化

计算它们的点积 (从而对应相应角度)

得到对应的反射光照的强度

<0代表光照在背面

最后计算颜色的强度并返回


结果对比

Unity3dShader - 模拟光照    Unity3dShader - 模拟光照

改变一下颜色

Unity3dShader - 模拟光照   Unity3dShader - 模拟光照

改变一下方向

Unity3dShader - 模拟光照  Unity3dShader - 模拟光照

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: