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。

posted @ 2022-02-11 13:08  番茄玛丽  阅读(344)  评论(0编辑  收藏  举报