源链接源链接11-26 22:44

5.《unityshader中级篇》Unity提供的CG/HLSL语义

我们看到了SV_POSITION,POSITION,COLOR0等。这些是CG/HLSL提供的语义。语义实际上就是一个赋给Shader输入输出的字符串,这个字符串表达了这个参数的含义。通俗的讲,这些语义可以让Shader知道从哪里读取数据,并把数据输出到哪里,这在Shader中是不可缺少的。

Unity为了方便对模型数据的传输,对一些语义进行了特别的规定。尤其是顶点着色器的输入结构体,像POSITION,NORMAL,TANGENT,TEXCOORD0,Unity会自动识别这些语义,对应的把模型坐标,法线,切线,第一组纹理坐标赋给它们。但对于顶点着色器的输出,也就是片元着色器的输入结构体来说,我们可以自行决定一些语义传递的数据,比如我们在会常用TEXCOORD系列传递一些坐标,颜色啥的数据,在这里它就不是纹理坐标了。

DirectX10以后,有了一种新的语义类型,就是系统数值语义(system-value semantics)。这类语义以SV开头,SV代表系统数值。比如用SV_POSITION修饰顶点着色器的输出变量pos,则pos就是齐次裁剪空间中的坐标。这些语义描述的变量是不可以随便赋值的,流水线需要使用它们完成特定的目的。比如SV_POSITION修饰的变量经过光栅化后会显示在屏幕上。

下表总结了应用阶段传递模型数据给顶点着色器是Unity常用的语义:

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

语义 概要
POSITION 模型空间中的顶点位置,通常是float4类型
TANGENT 顶点切线,float4
TEXCOORD0 纹理坐标, float2,float4
COLOR 顶点颜色,float4,fixed4
NORMAL 顶点法线,float3

TEXCOORDn中n的数目和Shader Model有关,Shader Model 2(Unity默认的Shader Model版本)和3中,n等于8,Shader Model 4和5中,n等于16。通常一个模型的纹理坐标组数不超过2,用TEXCOORD0和TEXCOORD1就够了。在内置的结构体appdata_full中,最多使用6个纹理坐标。

顶点着色器传递给片元着色器常用语义

语义 概要
SV_POSITION 裁剪空间中的顶点位置 ,结构体中必须包含一个用该语义的变量
COLOR1 第二组顶点颜色
COLOR0 第一组顶点颜色
TEXCOORDn 输出纹理坐标

除了SV_POSITION有特别含义,其他语义没有明确要求。也就是说我们可以存任何值到这些语义描述的变量中。通常我们习惯用TEXCOORDn来传递我们自定义的数值。

片元着色器输出常用语义

语义 概要
SV_Target 输出值存储在渲染目标中

点击关注我的微博,给大家带来欢乐

官场书屋二维码

小额赞赏

000
评论