《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.2 漫反射着色
本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.2节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.2 漫反射着色
在开始学习纹理映射之前,我们需要先理解漫反射着色是怎么工作的。某些物体的颜色比较均匀,表面很光滑,但是又不是光滑到那种像镜子一样光亮的程度。这种非反光材料最好的渲染方式就是使用漫反射着色器。虽然在真实世界中纯漫反射材料本身并不存在,但在游戏世界中漫反射着色器是一种大量用到的相对廉价的着色方式。
2.2.1 准备工作
创建漫反射着色器有多种方式。最快的一种方式是从Unity 5 的标准着色器开始,然后编辑标准着色器,移除所有纹理。在第1章中我们就是这么做的。
2.2.2 操作步骤
我们从标准着色器开始,按照下面的步骤逐步进行:
- 删除除_Color之外的所有属性:
- 在SubShader{}部分,删除_MainTex、_Glossiness和_Metallic变量。注意不要删除uv_MainTex,因为Cg不接受空的输入。这个值会被忽略。
- 删除surf()函数的函数体,用下面的代码替换:
- 你的着色器应该看起来是这样的:
因为该着色器是在一个标准着色器的基础上修改的,它会使用基于物理基础的渲染方式来模拟光照行为。如果你想做一种非拟实的外观,可以直接修改第一个#pragma指令来让其使用Lambert而不是Standard。如果你这么做了,还应该将SurfaceOutputStandard替换为SurfaceOutput。2.2.3 工作原理
着色器中,材质的渲染属性和光照模型之间是通过表面输出来通信的。表面输出是对当前光照模型所需的所有参数的一个封装。所以你应该能理解不同的光照模型需要不同的表面输出结构了。下面列出了Unity 5中三种主要的表面输出结构。
着色器类型 Unity 4 Unity 5
漫反射着色器 任意表面着色器
SurfaceOutput 标准着色器
SurfaceOutputStandard
高光着色器 任意表面着色器
SurfaceOutput 标准着色器(高光设置)
SurfaceOutputStandardSpecularSurfaceOutput结构有如下属性:
fixed3 Albedo:表示材质的漫反射颜色。
fixed3 Normal:如果写的话表示切面法线。
fixed3 Emission:表示材质发射的颜色(该属性在标准着色器中声明为half3)。
fixed Alpha:表示材质的透明度。
half Specular:表示光亮度,值从0到1。
fixed Gloss:表示光强度。
SurfaceOutputStandard结构有如下属性:
fixed Albedo:表示材质的基础颜色(表示是漫反射还是高光)。
fixed3 Normal。
half3 Emission:该属性声明为half3,而在SurfaceOutput中名字是fixed3。
fixed Alpha。
half Occlusion:表示遮挡,默认是1。
half Smoothness:表示光滑度,0表示粗糙,1表示光滑。
half Metallic:0表示非金属,1表示金属。
SurfaceOutputStandardSpecular结构有如下属性:
fixed3 Albedo。
fixed3 Normal。
half3 Emission。
fixed Alpha。
half Occlusion。
half Smoothness。
fixed3 Specular:表示高光颜色,与SurfaceOutput结构中的Specular属性有很大不同,这里可以指定一种颜色而非单一值。
正确使用表面着色器很重要的一点是用正确的值初始化表面输出结构。