Shader 学习之路-表面着色器(四)
表面着色器官方文档:https://docs.unity3d.com/Manual/SL-SurfaceShaders.html
1、定义:对顶点着色器和片元着色器进一层封装,主要部分为两个结构体(Input、SurfaceOutput)和编译指令。
2、编译指令:指明表面着色器使用表面的函数和光照函数,并设置可选参数
#pragma surface surfaceFunction lightModel [optionalparams]
表面函数(SurfaceFunction):包含属性友反射率、光滑度、透明度等,使用输入结构体Input 来设置各种属性。
光照函数:使用表面函数来模拟光照效果,Unity内置基于物理的光照模型Standard 和
StandardSpecular,非物理光照模型函数Lambert 和 BlinnPhong。
其他可选参数:
自定义修改函数:
vertex:VertexFunction:顶点修改,实现一些顶点动画等
finalcolor:ColorFunction:最终颜色修改、实现雾效
finalgbuffer:ColorFunction:延迟渲染修改,实现边缘检测等
finalprepass:ColorFunction:Prepass base修改
阴影:
addshadow:添加一个阴影投射Pass,一般FallBack 通用的光照模式可以找到,对于顶点动画、
透明度需要特殊处理。
fullforwardshadows:在前向渲染路径支持所有光源类型的阴影,默认是只有平行光,添加这个参数可以让点光火聚光灯友阴影渲染。
noshadows:取消所有阴影。
透明度混合测试:
alpha、alpha:auto:透明测试
alpha:blend 透明混合
alphatest:VariableName:VariableName 用来剔除不满足的片元
光照:
noambient:不应用任何环境光照或者光照探针(light probe)
novertexlights:不应用逐顶点光照
noforwardadd:去掉所有前向渲染的额外pass,即支持逐像素平行光,其他光源用逐顶点或者阴影计算。
控制代码生成:
exclude_path:deferred,exclude_path:forward,exclude_path:prepass 不需要为特定渲染路径生成代码。
3、两个结构体
Input 结构体
包含主纹理和法线纹理的采样坐标uv_MainTex 和 uv_BumpMap
SurfaceOutput:存储表面属性结构体,作为光照函数输入来计算光照
// Lighting.cginc中定义
struct SurfaceOutput
{
fixed3 Albedo; // diffuse color
fixed3 Normal; // tangent space normal, if written
fixed3 Emission;
half Specular; // specular power in 0..1 range,高光反射指数部分。
fixed Gloss; // specular intensity,高光反射强度系数。
fixed Alpha; // alpha for transparencies
};
// UnityPBSLighing.cginc中定义
struct SurfaceOutputStandard
{
fixed3 Albedo; // base (diffuse or specular) color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Metallic; // 0=non-metal, 1=metal
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // diffuse color
fixed3 Specular; // specular color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
4、表面着色器的渲染流水线
5、表面着色器的优缺点:
优点:表面着色器是在顶点-几何-片元着色器上层的抽象封装,不需要写复杂的代码,直接定义好相关的参数和编译指令就可以实现需要的效果。
缺点:表面着色器必须按照它的规则去写代码,自由度不高,而且内部生成的顶点-几何-片元着色器也不是最优的,往往会产生性能上面的问题。