Shader基础总结

  • 渲染状态
**常见的渲染状态设置选项**
状态名称 设置指令 说明
Cull Cull Back/Front/Off 设置剔除模式:剔除背面/正面/关闭剔除
ZTest ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always 设置深度测试时使用的函数
ZWrite ZWrite On/Off 开启/关闭深度写入
Blend Blend SrcFactor DstFactor 开启并设置混合模式
  • 标签
**SubShader的标签类型**
标签类型 说明
Queue 控制渲染顺序,指定该物体的渲染队列,可以使用自定义的渲染队列控制渲染顺序。
RenderType 对着色器进行分类,例如这是一个不透明或者透明的着色器
DisableBatching 指明是否对该SubShader使用批处理
ForceNoShadowCasting 控制使用该SubShader的物体是否会投射阴影。
IgnoreProjector 控制使用该SubShader的物体是否受Projector的影响。通常用于半透明物体
CanUseSpriteAtlas 当该SubShader用于精灵(Sprites)时,将该标签设置为False。
PreviewType 指明材质面板将如何预览该材质。默认为球形,可以设置为"Plane","SkyBox"。
  • 顶点的空间变换过程
在这里插入图片描述
  • 变换矩阵
**Unity内置的变换矩阵**
变量名 说明
UNITY_MATRIX_MVP 当前的模型观察投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 当前的模型观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间
UNITY_MATRIX_V 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间
UNITY_MATRIX_P 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间
UNITY_MATRIX_VP 当前的观察投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
_World2Object _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间
  • 内置文件
**Unity中一些常用的包含文件**
文件名 描述
UnityCG.cginc 包含了最常使用的帮助函数、宏和结构体等
UnityShaderVariables.cginc 在编译Unity Shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP
Lighting.cginc 包含了各种内置的光照模型,如果编写的是Surface Shader的话,会被自动包含进来
HLSLSupport.cginc 在编译Unity Shader时,会被自动包含进来。声明了很多用于跨平台编译的宏和定义
  • 结构体
**UnityCG.cginc中一些常用的结构体**
名称 描述 包含的变量
appdata_base 可用于顶点着色器的输入 顶点位置、顶点法线、第一组纹理坐标
appdata_tan 可用于顶点着色器的输入 顶点位置、顶点切线、顶点法线、第一组纹理坐标
appdata_full 可用于顶点着色器的输入 顶点位置、顶点法线、四组(或更多)组纹理坐标
appdata_img 可用于顶点着色器的输入 顶点位置、第一组纹理坐标
v2f_img 可用于顶点着色器的输出 裁剪空间中的位置、纹理坐标
  • 帮助函数
**UnityCG.cginc中常用的内置函数**
函数名 描述
float3 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间中从该顶点到摄像机的观察方向。内部实现使用了UnityWorldSpaceViewDir函数
float3 UnityWorldSpaceViewDir(float4 v) 输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir(float4 v) **仅可用于前向渲染中。**输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。内部实现使用了UnityWorldSpaceLightDir函数。没有被归一化
float3 UnityWorldSpaceLightDir(float4 v) **仅可用于前向渲染中。**输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化
float3 ObjSpaceLightDir(float4 v) **仅可用于前向渲染中。**输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化
float3 UnityObjectToWorldNormal(float3 normal) 把法线方向从模型空间转换到世界空间中
float3 UnityObjectToWorldDir(float3 dir) 把方向矢量dir从模型空间转换到世界空间中
float3 UnityWorldToObjectDir(float3 dir) 把方向矢量dir从世界空间转换到模型空间中
  • 常用语义
**从应用阶段传递模型数据给顶点着色器时的常用语义**
语义 描述
POSITION 模型空间的顶点位置,通常是float4类型
NORMAL 顶点法线,通常是float3类型
TANGENT 顶点切线,通常是float4类型
TEXCOORDn 该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依此类推。通常是float2或float4类型
COLOR 顶点颜色,通常是float4或fixed4类型
**从顶点着色器传递数据给片元着色器时的常用语义**
语义 描述
SV_POSITION 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。
COLOR0 通常用于输出第一组顶点颜色,但不是必须的
COLOR1 通常用于输出第二组顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7 通常用于输出纹理坐标,但不是必须的
**片元着色器输出时的常用语义**
语义 描述
SV_Target 输出值将会存储到渲染目标(render_target)中。