我们新建一个Standard Surface Shader,单击showgenerated code打开该表面着色器被编译成vfShader之后的代码。
代码框架如下:
每个重要的pass的片段程序中都进行了标准光照模型的处理,我们提取其中一个
打开Unity安装目录Editor\Data\CGIncludes中的UnityPBSLighting.cginc文件找到这两个方法。
LightingStandard_GI()函数处理全局光照,输出一个UnityGI型的全局光照参数,传入到LightingStandard方法中。
LightingStandard()方法中计算一些参数传入核心的UNITY_BRDF_PBS()方法中。
我们打开UnityStandardBRDF.cginc找到BRDF1_Unity_PBS()方法
这里就是对BRDF光照模型的实现(BRDF1_Unity_PBS是正品,BRDF2_Unity_PBS是高仿,BRDF3_Unity_PBS是山寨,效果是依次降,性能依次升)。
另外Lighting.cginc中还封装了Lambert和BlinnPhong光照模型,把光照模型改成Lambert。
编译后的文件是这样的:
编译的文件是unity自己搞定的,很多东西不需要编程者操心,当然,在编写顶点片段着色器代码的时候就需要自己搞定。
下面来看看Standard.Shader:
下载"Standard" Shader 并打开,找到第一个pass的主体。
打开UnityStandardCore.cginc文件找到片段程序,发现也是用的该光照模型。(以其中一个通道为例)