unity shader 入门之路(四)Unity支持的语义

本文详细介绍了Unity中Shader的语义使用,包括从应用阶段传递数据到顶点着色器、从顶点着色器到片元着色器及片元着色器输出时Unity支持的常用语义。此外还提供了复杂变量类型的定义示例。


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

语义描述
POSITION模型空间中的顶点位置,通常是float4类型
NORMAL顶点法线,通常是float3类型
TANGENT顶点切线,通常是float4类型
TEXCOORDn,如TEXCOORD0、TEXCOORD1该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,依此类推,通常是float2或float4类型
COLOR顶点颜色,通常是fixed4或float4类型
其中TEXCOORDn中n的数目是和Shader Model有关的,例如一般在Shader Model 2(即Unity默认编译到的Shader Model版本)和Shader Model 3中,n等于8,而在Shader Model 4和Shader Mode 5中,n等于16。通常情况下,一个模型的纹理坐标组数一般不超过2,即我们往往只使用TEXCOORD0和TEXCOORD1。在Unity内置的数据结构体appdata_full中,它最多使用了6个坐标纹理组。

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

语义描述
SV_POSITION裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0通常用于输出第一组顶点颜色,但不是必须的
COLOR1通常用于输出第二组顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7通常用于输出纹理坐标,但不是必须的
上面的语义中,除了SV_POSITION是有特别含义外,其他语义对变量的含义没有明确要求,也就是说,我们可以存储任意值到这些语义描述变量中。通常,如果我们需要把一些自定义的数据从顶点着色器传递给片元着色器,一般选用TEXCOORD0等。

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

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

定义复杂的变量类型

上面提到的语义绝大部分用于描述标量或矢量类型的变量,例如fixed2、float、float4、fixed4等。下面的代码给出了一个使用语义来修饰不同类型变量的例子:

  1. struct v2f {
  2. float4 pos : SV_POSITION;
  3. fixed3 color0 : COLOR0;
  4. fixed4 color1 : COLOR1;
  5. half value0 : TEXCOORD0;
  6. float2 value1 : TEXCOORD1;
  7. };
一个语义可以使用的寄存器只能处理4个浮点值(float)。因此,如果我们想要定义矩阵类型,如float3x4、float4x4等变量就需要使用更多的空间。一种方法是,把这些变量拆分成多个变量,例如对于float4x4的矩阵类型,我们可以用拆分成4个float4类型的变量,每个变量存储了矩阵中的一行数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值