内置着色器包含文件
Unity 含有几个可由您的着色器程序用来引入预定义变量和帮助函数的文件。这是由标准 #include
指令完成的,例如:
CGPROGRAM // ... #include "UnityCG.cginc" // ... ENDCG
Unity 中的着色器包含文件具有 .cginc
扩展名,且内置文件为:
HLSLSupport.cginc
- (自动包含) 用于跨平台着色器编译的帮助宏和定义。UnityCG.cginc
- 常用的全局变量和帮助函数。AutoLight.cginc
- 光照和阴影功能,例如,表面着色器在内部使用此文件。Lighting.cginc
- 标准表面着色器光照模型;当您编写表面着色器时自动将其包含。TerrainEngine.cginc
- 用于地形 (Terrain) 和植被 (Vegetation) 着色器的帮助函数。
如果您想看看帮助代码中具体完成了什么操作,可在 Unity 应用程序内找到这些文件(Windows 操作系统:
;Mac 操作系统: )。HLSLSupport.cginc
在编译着色器时该文件被自动包含。它通常声明多个预处理器宏来协助多平台着色器的开发。
UnityCG.cginc
该文件通常包含在 Unity 着色器中以引入多个帮助函数和定义。
UnityCG.cginc 中的数据结构
struct
appdata_base
:具有位置、法线和一个纹理坐标的顶点着色器输入。struct
appdata_tan
:具有位置、法线、切线和一个纹理坐标的顶点着色器输入。struct
appdata_full
:具有位置、法线、切线、顶点颜色和两个纹理坐标的顶点着色器输入。struct
appdata_img
:具有位置和一个纹理坐标的顶点着色器输入。
UnityCG.cginc 中的通用帮助函数
float3 WorldSpaceViewDir (float4 v)
- 返回从给定对象空间顶点位置朝向相机的世界坐标空间方向(未规范化)。float3 ObjSpaceViewDir (float4 v)
- 返回从给定对象空间顶点位置朝向相机的对象空间方向(未规范化)。float2 ParallaxOffset (half h, half height, half3 viewDir)
- 计算用于视差法线贴图 (normal mapping) 的 UV 偏移量。fixed Luminance (fixed3 c)
- 将颜色转换为亮度(灰度)。fixed3 DecodeLightmap (fixed4 color)
- 从 Unity 光照贴图(视平台而定为 RGBM 或 dLDR)解码颜色。float4 EncodeFloatRGBA (float v)
- 将 [0..1) 范围内的浮点数编码为 RGBA 颜色,以存储于低精度渲染目标中。float DecodeFloatRGBA (float4 enc)
- 将 RGBA 颜色解码为一个浮点数。类似地,使用两个颜色通道的
float2 EncodeFloatRG (float v)
和float DecodeFloatRG (float2 enc)
float2 EncodeViewNormalStereo (float3 n)
- 将视图空间法线编码为 0..1 范围内的两个数字。float3 DecodeViewNormalStereo (float4 enc4)
- 从 enc4.xy 解码视图空间法线。
UnityCG.cginc 中的正向渲染帮助函数
这些函数仅在使用正向渲染(ForwardBase 或 ForwardAdd 通道类型)时有用。
float3 WorldSpaceLightDir (float4 v)
- 在给定对象空间顶点位置的情况下,计算到光源的世界坐标空间方向(未规范化)。float3 ObjSpaceLightDir (float4 v)
- 在给定对象空间顶点位置的情况下,计算到光源的对象空间方向(未规范化)。float3 Shade4PointLights (...)
- 在光照数据被紧密打包进向量中的情况下,计算四个点光灯的照明。正向渲染使用这个函数来计算逐顶点光照。
UnityCG.cginc 中的顶点光照帮助函数
这些函数仅在使用逐顶点光照着色器(“顶点”(Vertex) 通道类型)时有用。
float3 ShadeVertexLights (float4 vertex, float3 normal)
- 在给定对象空间位置和法线的情况下,计算四个逐顶点光源和环境光的照明。