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