Skip to content

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 命令章节。