Unity Shader:(五)语义、Debug、规范
一、语义
1. a2v 语义(a代表应用阶段,v代表顶点着色器)
POSITION:float4类型,模型空间中顶点的位置。
NORMAL:float3类型,顶点法线。
TANGENT:float4类型,顶点切线。
TEXCOORDn:float2/float4类型,顶点纹理坐标。
COLOR:fixed4/float4类型,顶点颜色。
2. v2f 语义(f代表片元着色器)
SV_POSITION:结构体中必须使用,裁剪空间中的顶点坐标。
COLOR0:输出第一组顶点颜色
COLOR1:输出第二组顶点颜色
TEXCOORD0~TEXCOORD7:输出纹理坐标
3. f 语义
SV_Target:输出值会存储到渲染目标中
二、Debug
1. 用appdata_full输出结果
#include "UnityCG.cginc"
struct appdata_full
{
float4 vertex: POSITION;
float4 tangent: TANGENT;
float3 normal: NORMAL;
float4 texcoord: TEXCOORD0;
float4 texcoord1: TEXCOORD1;
float4 texcoord2: TEXCOORD2;
float4 texcoord3: TEXCOORD3;
#if defined(SHADER_API_XBOX360)
half4 texcoord4: TEXCOORD4;
half4 texcoord5: TEXCOORD5;
#endif
fixed4 color: COLOR
}
2. VS提供的Graphics Debugger工具。
3. Unity提供的帧调试器 (路径:Window->Frame Debugger)。
三、规范
1. 优先选择低精度浮点值
float是最高精度浮点值,通常是32位;half通常16位(-6W~6W);fixed通常11位(-2.0~2.0)
尽可能使用精度较低的类型:颜色和单位矢量用fixed类型,更大范围的用half类型,最后才选择float类型。
这个差距在移动平台尤其明显,所以一定要在移动平台测试效果。
2. 减少计算量
错误提示:temporary register limit of 8 exceeded
或
错误提示:Arithmetic instruction limit of 64 exceeded; 65 arithmetic instructions needed to compile program
原因是计算量超过了临时寄存器数目或指令数目。我们可以通过制定更高等级的Shader Target来解决。但是最好还是减少计算量。
#pragma target 2.0 默认,不支持顶点纹理采样,不支持LOD纹理采样
#pragma target 3.0 支持顶点纹理采样
#pragma target 4.0 支持几何着色器
#pragma target 5.0
3. 不使用分支和循环语句
GPU里计算分支、循环语句的计算量不同于CPU,性能会成倍下降。
就算非得使用,尽量把放在片元着色器的计算放在顶点着色器中,或者直接在CPU中预计算再把结果传给Shader。