Unity Shader中的CG/HLSL语义与Shader整洁之道

语义实际上就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。

Unity支持的语义

从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义

  • POSITION——模型空间中的顶点位置,通常是float4类型
  • NORMAL——顶点法线,通常是float3类型
  • TANGENT——顶点切线。通常是float4类型
  • TEXCOORDn(如TEXCOORD0,TEXCOORD1)——该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,以此类推,一般为float2或float4类型
  • COLOR——顶点颜色,通常是fixed4或者float4类型

从顶点着色器传递数据给片元着色器时Unity使用的常用语义

  • VS_POSITION裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,等同于DirectX9中的POSITION但最好使用VS_POSITION
  • COLOR0通常用于输出第一组顶点颜色,不是必须的
  • COLOR1通常用于输出第二组顶点颜色,不是必须的
  • TEXCOORD0 ~ TEXCOORD7通常用于输出纹理坐标,不是必须的

片元着色器输出是Unity支持的常用语义

SV_Target 输出值将会储存到渲染目标(render target)中,等同于DirectX9中的COLOR语义,但最好使用SV_Target

如何定义复杂的变量

在这里插入图片描述

  • 一个语义可以使用的的寄存器只能处理4个浮点值(float)
  • 因此,如果我们想要定义矩阵类型,如 float3 * 4、float4 * 4等变量就需要使用更多的空间
  • 一种方式是,把这些变量拆分成多个变量
  • 例如,对于float4 * 4的矩阵类型,我们可以拆分成4个float类型的变量,每个变量储存了矩阵中的一行数据

Shader整洁之道

CG/HLSL中的3种的数值类型float、half、fixed

  • 以为 类型——精度
  • float——最高精度的浮点值,通常使用32位来存储
  • half——中等精度的浮点值,通常使用16位来存储,精度范围是-60 000~+60 000
  • fixed——最低精度的浮点值,通常使用11位来存储,精度范围是-2.0~+2.0

大多数线代的桌面GPU会把所有计算都按最高浮点数精度进行计算,也就是说float、half、fixed在这些平台上实际是等价的,这意味着我们PC上很难开出因为half和fixed精度二带来的不同。
移动平台的GPU上,它们的确会有不同的精度范围,而且不同精度的浮点值的运算速度也会有差异。因此,我们应该确保在真正的移动平台上验证我们的shader。
fixed精度实际上只在一些较旧的移动平台上有用,在大多数现代GPU上,它们内部吧fixed和half当成同等精度来对待

规范语法

DirectX平台对shader的语义有更加严格的要求
例如,使用和变量类型相匹配的参数数目来对变量进行初始化

慎用分支和循环语句

分支判断语句中使用的条件变量最好是常数,即使在shader运行过程中不会发生变化
每个分支中包含的操作尽可能少
分支的嵌套层数尽可能少

不要除以0

这样的代码的结果往往是不可预测的

猜你喜欢

转载自blog.csdn.net/weixin_50617270/article/details/123773115