1.顶点/片元函数声明
#pragma vertex name
#pragma fragment name
其中name为函数名
2.常用语义
从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义
语义 | 描述 |
POSITION | 模型空间中的顶点位置,通常为float4类型 |
NORMAL | 顶点法线,通常为float3类型 |
TANGENT | 顶点切线,通常为float4类型 |
TEXCOORDn,如TEXCOORD0,TEXCOORD1等 |
该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依此类推,通常为float2或float4类型 |
COLOR | 顶点颜色,通常是fixed4或float4 |
从顶点着色器传递数据给片元着色器时Unity使用的常用语义
语义 | 描述 |
SV_POSITION | 裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DirectX9中的POSITION,但最好使用SV_POSITION |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必须的 |
COLOR1 | 通常用于输出第二组顶点颜色,但不是必须的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出纹理坐标,但不是必须的 |
片元着色器输出时Unity支持的常用语义
语义 | 描述 |
SV_Target | 输出值将会存储到渲染目标(render target)中。等同于DirectX9中的COLOR语义,但最好使用SV_Target |
3.ShaderLab属性类型和Cg变量类型的匹配关系
ShaderLab属性类型 | Cg变量类型 |
Color,Vector | float4,half4,fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
Cube | samplerCube |
3D | sampler3D |
4.UnityShader中常用的包含文件
文件名 | 描述 |
UnityCG.cginc | 包含了最常使用的帮助函数、宏和结构体等 |
UnityShaderVariables.cginc | 在编译Unity Shader时,会被自动包含进来。包含了很多内置的全局变量,如UNITY_MATRIX_MVP等 |
Lighting.cginc | 包含了各种内置的光照模型,如果编写的是Surface Shader的话,会自动包含进来 |
HLSLSupport.cginc | 在编译Unity Shader时,会被自动包含进来。声明了很多跨平台编译的宏和定义 |
5.UnityCG.cginc中一些常用的结构体
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁剪空间中的位置、纹理坐标 |
6.UnityCG.cginc中的一些常用的帮助函数
函数名 | 描述 |
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中。 |
float3 UnityObjectToWorldDir(float3 dir) | 把方向矢量从模型空间转换到世界空间中。 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间变换到模型空间中。 |
7.Cg/HLSL中3种精度的数值类型
类型 | 精度 |
float | 最高精度的浮点值。通常使用32位来存储。 |
half | 中等精度的浮点值。通常使用16位来存储,精度范围是-60000~60000 |
fixed | 最低精度的浮点值。通常使用11位来存储,精度范围是-2.0~2.0 |
8.Unity支持的Shader Target
指令 | 描述 |
#pragma target 2.0 | 默认的Shader Target等级。相当于Direct3D 9上的 Shader Model 2.0,不支持对顶点纹理的采样, 不支持显式的LOD纹理采样 |
#pragma target 3.0 | 相当于Direct3D 9上的Shader Model 3.0,支持对 顶点纹理的采样等。 |
#pragma target 4.0 | 相当于Direct3D 9上的Shader Model 4.0,支持几何 着色器等 |
#pragma target 5.0 | 相当于Direct3D 9上的Shader Model 5.0 |