SandMod 语义
语义(Semantics)用于表示输入和输出对应 着色器(Shader)变量对应的内容。
GLSL 原本没有语义的相关内容,为了更符合主流的游戏着色器编辑习惯,SandMod 封装了一层语义。
指定语义的方法
- 在参数声明后附加冒号与语义命名,指定对应语义。
c++
vec4 pos : POSITION;- 定义一个输入 结构体(Struct),在结构体内每个数据后附加冒号与语义命名。
c++
struct vrt
{
vec4 pos : POSITION;
vec4 color : COLOR;
vec2 uv : TEXCOORD0;
};支持的输入语义
顶点着色器输入语义
顶点着色器输入语义(Vertex Shader Input Semantics)作为 网格(Mesh)顶点数据作为输入传递给 顶点着色器(Vertex Shader)时,用作描述每一个顶点的某个数据,比如 位置(Position),法线(Normal),纹理坐标(UV),颜色(Color),切线(Tangent)。对应网格顶点数据的详细信息请参阅 网格数据 章节。
| 语义 | 描述 |
POSITION | 表示顶点位置,语义对应值的变量类型为 vec3 或 vec4 。 |
NORMAL | 表示顶点法线,语义对应值的变量类型为 vec3 。 |
TEXCOORD0 | 表示第 1 个 UV 坐标,语义对应值的变量类型为 vec2 、vec3 或 vec4。 |
TEXCOORD1 / TEXCOORD2 / TEXCOORD3 / TEXCOORD4 / TEXCOORD5 | 表示第 2 / 3 / 4 / 5 / 6 个 UV 坐标,语义对应值的变量类型为 vec2 、vec3 或 vec4。 |
TANGENT | 表示切线向量,用于确定 法线贴图(Normal Texture)、纹理贴图(Texture)的方向位置,语义对应值的变量类型为 vec4 。 |
COLOR | 是每个顶点的颜色值,以 RGBA 表示,语义对应值的变量类型为 vec4 。 |
当网格数据包含的分量少于顶点着色器输入所需的分量时,除了默认值为 1 的 w 分量,其余分量将用 0 填充。
| -------------- 例如,网格(Mesh)的 纹理坐标(UV)仅包含 x 和 y 分量的 2D 向量。如果 顶点着色器(Vertex Shader)定义 vec4 类型的变量指定 TEXCOORD0 语义输入,则顶点着色器接收到该每个顶点纹理坐标的值显示为 (x,y,0,1)。-------------- |
值得注意的是,如需使用顶点着色器输入语义,需要使用 #pragma vertex [NAME] 命令指定函数作为 顶点着色器(Vertex Shader)的入口,具体设置方法请参阅 vertex 命令章节。
片元着色器输入语义
顶点着色器(Vertex Shader)需要向 片元着色器(Fragment Shader)传递很多变量,其中顶点着色器需要输出每个顶点的最终 剪裁空间(Clip Space)位置,以便系统知道在屏幕上的哪个位置以及在什么深度对其进行光栅化,即从 三维(3D)场景空间到屏幕空间的变换后的顶点位置。此信息需要片元着色器输入语义 SV_POSITION 传递。
| 语义 | 描述 |
| SV_POSITION | 网格顶点在剪裁空间、投影空间中的位置信息。用于 片元着色器(Fragment Shader)的输入。语义对应值的变量类型为 vec4 。 |
值得注意的是,如需使用片元着色器输入语义,需要使用 #pragma fragment [NAME] 命令指定函数作为 片元着色器(Fragment Shader)的入口,具体设置方法请参阅 fragment 命令章节。
