表面着色器编译指令 #pragma surface
#pragma surface 表面着色器函数名 光照模型 [可选参数]
光照模型表:LightModel
光照模型可以用Unity预设的,也可以自定义 自定义文档:https://docs.unity3d.com/cn/2020.3/Manual/SL-SurfaceShaderLighting.html
| 关键字 | 光照模型类型 | 
|---|---|
| Standard | PBR-Metallic 物理金属度 | 
| StandardSpecular | PBR-Specular 物理镜面反射 | 
| Lambert | 漫射 | 
| BlinnPhong | 镜面反射 | 
//示例#pragma surface 表面着色器函数名 Standard [可选参数]
可选参数
透明度和 Alpha 测试
由参数alpha和alphatext指令控制
| 指令 | 说明 | 
|---|---|
| alpha 或 alpha:auto | 对于简单的光照函数,将选择淡化透明度(与 alpha:fade 相同); 对于基于物理的光照函数,将选择预乘透明度(与 alpha:premul 相同)。  | 
| alpha:blend | 启用 Alpha 混合。 | 
| alpha:fade | 启用传统淡化透明度。 | 
| alpha:premul | 启用预乘 Alpha 透明度。 | 
| alphatest:VariableName | 启用 Alpha 镂空透明度。剪切值位于具有 VariableName 的浮点变量中。 您可能还想使用 addshadow 指令生成正确的阴影投射物通道。  | 
| keepalpha | 默认情况下,无论输出结构的 Alpha 输出是什么,或者光照函数返回什么,不透明表面着色器都将 1.0(白色)写入 Alpha 通道。 使用此选项可以保持光照函数的 Alpha 值,即使对于不透明的表面着色器也是如此。  | 
| decal:add | 附加贴花着色器(例如 terrain AddPass)。 这适用于位于其他表面之上并使用附加混合的对象。 请参阅表面着色器示例  | 
| decal:blend | 半透明贴花着色器。这适用于位于其他表面之上并使用 Alpha 混合的对象。 请参阅表面着色器示例  | 
自定义修改器函数
虽然表面着色器可以不定义 vertex顶点函数 但如果有需要,依旧可以通过编译指令编译,重新手动定义
| vertex : [VertexFunction] | 自定义顶点修改函数。 在生成的顶点着色器的开始处调用此函数,并且此函数可以修改或计算每顶点数据。  | 
|---|---|
| finalcolor : [ColorFunction] | 自定义最终颜色修改函数。 | 
| finalgbuffer : [ColorFunction] | 用于更改 G 缓冲区内容的自定义延迟路径。 | 
| finalprepass : [ColorFunction] | 自定义预通道基本路径。 | 
阴影和曲面细分
可以提供其他指令来控制阴影和曲面细分的处理方式。
| addshadow | 生成阴影投射物通道。常用于自定义的顶点修改,以便阴影投射也可以获得程序化顶点动画。 通常情况下,着色器不需要任何特殊的阴影处理,因为它们可以通过回退机制来使用阴影投射物通道。  | 
|---|---|
| fullforwardshadows | 支持前向渲染路径中的所有光源阴影类型。 默认情况下,着色器仅支持前向渲染中来自一个方向光的阴影(以节省内部着色器变体数量)。 如果在前向渲染中需要点光源阴影或聚光灯阴影,请使用此指令。  | 
| tessellate : TessFunction | 使用 DX11 GPU 曲面细分;该函数计算曲面细分因子。有关详细信息,请参阅表面着色器曲面细分。 | 
代码生成选项
默认情况下,生成的表面着色器代码会尝试处理所有可能的光照/阴影/光照贴图情况。 但是在某些情况下,您知道您不需要其中的一部分,可以调整生成的代码以跳过它们。 这样可以减小着色器,从而提高加载速度。
| exclude_path:deferred exclude_path:forward exclude_path:prepass  | 
不为给定的渲染路径生成通道。 (分别对应延迟着色路径、前向路径和旧版延迟路径)  | 
|---|---|
| noshadow | 禁用此着色器中的所有阴影接受支持。 | 
| noambient | 不应用任何环境光照或光照探针。 | 
| novertexlights | 在前向渲染中不应用任何光照探针或每顶点光源。 | 
| nolightmap | 禁用此着色器中的所有光照贴图支持。 | 
| nodynlightmap | 禁用此着色器中的运行时动态全局光照支持。 | 
| nodirlightmap | 禁用此着色器中的方向光照贴图支持。 | 
| nofog | 禁用所有内置雾效支持。 | 
| nometa | 不生成“Meta”通道(由光照贴图和动态全局光照用于提取表面信息)。 | 
| noforwardadd | 禁用前向渲染附加通道。这会使着色器支持一个完整方向光,所有其他光源均进行每顶点/SH 计算。也能减小着色器。 | 
| nolppv | 禁用此着色器中的光照探针代理体支持。 | 
| noshadowmask | 为此着色器禁用阴影遮罩支持(包括 Shadowmask 和 Distance Shadowmask)。 | 
其他选项
| softvegetation | 仅在开启 Soft Vegetation 时才渲染表面着色器。 | 
|---|---|
| interpolateview | 在顶点着色器中计算视图方向并进行插值;而不是在像素着色器中计算。 这可以使像素着色器更快,但会额外消耗一个纹理插值器。  | 
| halfasview | 将半方向矢量传入光照函数而不是视图方向。 计算半方向并按每个顶点对其进行标准化。 这更快,但并不完全正确。  | 
| approxview | 在 Unity 5.0 中已删除。请改用 interpolateview。 | 
| dualforward | 在前向渲染路径中使用双光照贴图。 | 
| dithercrossfade | 使表面着色器支持抖动效果。 然后,可将此着色器应用于使用细节级别组 (LOD Group) 组件(配置为交叉淡入淡出过渡模式)的游戏对象。  | 
