语义

语义是附加到着色器输入或输出的字符串,用于传达有关参数预期用途的信息。 在着色器阶段之间传递的所有变量都需要语义。 用于向着色器变量添加语义的语法 (DirectX HLSL (变量语法) ) 。

一般情况下,管道阶段之间传递的数据是完全通用的,系统不会唯一解释数据;允许使用没有任何特殊含义的任意语义。 Direct3D 10 (更高版本中的参数) 包含这些特殊语义的参数称为系统 值语义

Direct3D 9 和 Direct3D 10 及更高版本中支持的语义

Direct3D 9 和 Direct3D 10 及更高版本都支持以下类型的语义。

顶点着色器语义

附加到顶点着色器参数时,这些语义具有意义。 Direct3D 9 和 Direct3D 10 及更高版本都支持这些语义。

输入 说明 类型
BINORMAL [ n] 二进制 float4
BLENDINDICES [ n] 混合索引 uint
BLENDWEIGHT [ n] 混合权重 FLOAT
COLOR [ n] 漫射和反射颜色 float4
NORMAL [ n] 法向量 float4
POSITION [ n] 对象空间中的顶点位置。 float4
POSITIONT 转换后的顶点位置。 float4
PSIZE [ n] 点大小 FLOAT
TANGENT [ n] 正切 float4
TEXCOORD [ n] 纹理坐标 float4
输出 说明 类型
COLOR [ n] 漫射或反射颜色 float4
顶点化 FLOAT
POSITION [ n] 顶点在同质空间中的位置。 通过将 x、y、z (除以 w,计算屏幕) 位置。 每个顶点着色器都必须写出具有此语义的参数。 float4
PSIZE 点大小 FLOAT
TESSFACTOR [ n] 销售因子 FLOAT

n 是介于 0 和支持的资源数之间的可选整数。 例如 POSITION0、TEXCOORD1 等。

像素着色器语义

附加到像素着色器输入参数时,这些语义具有意义。 Direct3D 9 和 Direct3D 10 及更高版本都支持这些语义。

输入 说明 类型
COLOR[n] 漫射或反射颜色。 float4
TEXCOORD[n] 纹理坐标 float4
VFACE 指示后向基元的浮点标量。 负值向后显示,而正值面向相机。
[!Note]
Direct3D 9 着色器模型 3.0 中提供了此语义。 对于 Direct3D 10 及更高版本, SV_IsFrontFace。

FLOAT
VPOS 屏幕空间 (x,y) 像素位置。 若要将使用此语义 (的 Direct3D 9 着色器) 转换为 Direct3D 10 及更高版本的着色器,请参阅 Direct3D 9 VPOS 和 Direct3D 10 SV_Position) float2
输出 说明 类型
COLOR[n] 输出颜色 float4
DEPTH[n] 输出深度 FLOAT

n 是介于 0 和支持的资源数之间的可选整数。 例如 PSIZE0、COLOR1 等。

COLOR 语义仅在着色器兼容性模式下有效 (即,当着色器是使用 D3D10 SHADER ENABLE _ _ _ BACKWARDS COMPATIBILITY _) 。

仅 Direct3D 10 及更高版本支持语义。

以下类型的语义已新引入 Direct3D 10,不适用于 Direct3D 9。

System-Value语义

系统值语义是 Direct3D 10 的新增功能。 所有系统值以 SV 前缀开头,一个常见示例是 SV POSITION,该位置由光 _ _ 栅器阶段解释。 系统值在管道的其他部分有效。 例如,可以将 SV _ 位置指定为顶点着色器以及输出的输入。 像素着色器只能写入具有 SV 深度和 _ SV _ 目标系统值语义的参数。

其他系统值 (SV _ VertexID、SV _ InstanceID、SV _ IsFrontFace) 只能输入到管道中可以解释特定值的第一个活动着色器中;之后,着色器函数必须将值传递到后续阶段。

SV PrimitiveID 是仅输入管道中第一个活动着色器以解释特定值的规则的例外情况;硬件可以提供与外壳着色器阶段、域着色器阶段的输入相同的 ID 值,之后的任何阶段都是第一个启用的阶段:几何着色器阶段或像素着色器阶段。 _

如果启用了分面,则存在外壳着色器阶段和域着色器阶段。 对于给定的修补程序,相同的 PrimitiveID 适用于修补程序的外壳着色器调用,以及所有已分配域着色器调用。 同一 PrimitiveID 也会传播到下一个活动阶段;geometry-shader 阶段或像素着色器阶段(如果已启用)。

如果几何着色器输入 SV PrimitiveID,并且由于它可以每次调用输出零个或多个基元,因此,如果后续像素着色器输入 _ _ SVPritiveID,着色器必须针对每个输出基元对其自己的 SV _ PrimitiveID 值进行编程。

另举一例,顶点着色器阶段无法解释 SV _ PrimitiveID,因为顶点可以是多个基元的成员。

这些语义已添加到 Direct3D 10;它们在 Direct3D 9 中不可用。

光栅器阶段的系统值语义。

System-Value语义 说明 类型
SV _ ClipDistance [ n] 剪辑距离数据。 SV _ ClipDistance 值均假定为与平面之间的 float32 有签名距离。 基元设置仅对像素调用 rasterization,其内插平面距离 (为) = 0 >像素。 可以通过将一个或多个顶点元素 (多个) 组件声明为 SV _ ClipDistance,同时实现多个剪辑平面。 组合的剪辑和剔除距离值最多为 D3D CLIP 或 CULL DISTANCE COUNT 组件(最多为 # _ _ _ D3D CLIP 或 _ _ # _ _ _ CULL _ DISTANCE ELEMENT _ COUNT _ 寄存器)。 可用于要读取或写入的所有着色器,但可以写入值但不将该值作为输入的顶点着色器除外。
贴板属性 的工作方式与 SV ClipDistance 类似,但适用于所有硬件功能级别 _ 9 x _ 及更高版本。 有关详细信息,请参阅功能 级别 9 硬件 上的用户剪辑平面
FLOAT
SV _ CullDistance [ n] 剔除距离数据。 如果 () 顶点元素 () ,则每个值都假定为与平面之间的 float32 有环距离。 如果基元中所有顶点 (的平面距离) 都为 0,则基元<丢弃。 可以通过将一个或多个顶点元素的多个 (声明为 SV CullDistance) ,同时使用多个剔除 _ 平面。 组合的剪辑和剔除距离值最多为 D3D CLIP 或 CULL DISTANCE COUNT 组件(最多为 # _ _ _ D3D CLIP 或 _ _ # _ _ _ CULL _ DISTANCE ELEMENT _ COUNT _ 寄存器)。 可用于要读取或写入的所有着色器,但可以写入值但不将该值作为输入的顶点着色器除外。
FLOAT
SV _ 覆盖范围 可以在输入、输出或两个像素着色器上指定的掩码。
对于像素着色器上的 SV _ 覆盖率,ps 4 1 或更高版本支持 _ _ OUTPUT。
对于像素着色器上的 SV _ 覆盖率,INPUT 要求 ps _ 5 _ 0 或更高。
uint
SV _ 深度 深度缓冲区数据。 可以通过像素着色器来写入。 FLOAT
SV _ DepthGreaterEqual 在像素着色器中,可以输出深度,只要它大于或等于光栅器确定的值。 启用调整深度而不禁用早期 Z。 FLOAT
SV _ DepthLessEqual 在像素着色器中,只要其小于或等于光栅器确定的值,就可以输出深度。 启用调整深度而不禁用早期 Z。 FLOAT
SV _ DispatchThreadID 定义每个组的每个维度在调度调用内的全局线程偏移量。 作为计算着色器的输入提供。 (只读) uint3
SV _ DomainLocation 定义当前域点在当前域点上的计算位置。 作为域着色器的输入提供。 (只读) float2 | 3
SV _ GroupID 定义调度调用的每个维度中的组偏移量。 作为计算着色器的输入提供。 (只读) uint3
SV _ GroupIndex 为给定组中的给定线程提供平展索引。 作为计算着色器的输入提供。 (只读) uint
SV _ GroupThreadID 定义组中每个维度的组内的线程偏移量。 作为计算着色器的输入提供。 (只读) uint3
SV _ GSInstanceID 定义几何图形着色器的实例。 作为几何着色器的输入提供。 实例是必需的,因为几何着色器在同一几何基元上最多可调用32次。 uint
SV _ InnerCoverage 表示低估的保守光栅化信息 (即是否有保证) 完全覆盖的像素。 可以通过像素着色器读取或写入。
SV _ InsideTessFactor 定义修补面的分割量。 在用于写入的 "球面" 着色器中提供,在用于读取的域着色器中可用。 float | float [ 2]
SV _ InstanceID 由运行时自动生成的每个实例标识符 (参阅 使用 System-Generated 值 (Direct3D 10) ) 。 适用于所有着色器。
SV _ IsFrontFace 指定三角形是否正面朝上。 对于线条和点,IsFrontFace 的值为 true。 例外情况是绘制的线条 (线框模式) ,其设置 IsFrontFace 的方式与在纯色模式下栅格化三角形相同。 可由几何图形着色器写入,并由像素着色器读取。 bool
SV _ OutputControlPointID 定义要在其上进行操作的控件点 ID 的索引,该操作由外凸着色器的主入口点调用。 只能由凸着色器读取。 uint
SV _ 位置 如果为 _ 着色器的输入声明了 SV 位置,则它可以指定两个指定的内插模式之一: linearNoPerspective 或 linearNoPerspectiveCentroid,其中后者导致在进行多级平滑消除时提供质心的 xyzw 值。 在着色器中使用时,SV _ 位置描述像素位置。 在所有着色器中可用,以0.5 偏移量获取像素中心。 float4
SV _ PrimitiveID 由运行时自动生成的每个基元标识符 (参阅 使用 System-Generated 值 (Direct3D 10) ) 。 可由几何图形或像素着色器写入,并由几何图形、像素、球面或域着色器读取。 uint
SV _ RenderTargetArrayIndex 呈现目标数组索引。 应用于几何图形着色器输出,并指示像素着色器将向其绘制基元的呈现目标数组切片。 _只有当呈现目标为数组资源时,SV RenderTargetArrayIndex 才有效。 此语义仅适用于基元;如果基元有多个顶点,则使用前导顶点中的值。 此值还指示深度/模具视图的哪个阵列切片用于读/写目的。
可从几何图形着色器写入,并由像素着色器读取。
如果 D3D11_FEATURE_DATA_D3D11_OPTIONS3:: VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue ,则 SV _ RenderTargetArrayIndex 将应用到光栅器馈送的任何着色器。
uint
SV _ SampleIndex Frequency 索引数据示例。 仅可通过像素着色器读取或写入。 uint
SV _ StencilRef 表示当前像素着色器模具引用值。 仅可通过像素着色器写入。 uint
SV _ Target [ n ] ,其中 0 <= n <= 7 将存储在呈现器目标中的输出值。 索引指示要向其中写入8个可能绑定的呈现器目标的哪一个。 此值可用于所有着色器。 float [ 2 | 3 | 4]
SV _ TessFactor 定义修补程序每个边缘的分割量。 可用于在 "球面" 着色器中写入和读取域着色器。 float [ 2 | 3 | 4]
SV _ VertexID 由运行时自动生成的每个顶点的标识符 (参阅 使用 System-Generated 值 (Direct3D 10) ) 。 仅作为顶点着色器的输入提供。 uint
SV _ ViewportArrayIndex 视区数组索引。 应用于几何图形着色器输出,并指示要为当前写出的基元使用哪个视区。可以通过像素着色器读取。 在将基元传递到光栅化程序之前,将针对索引所指定的视区对基元进行转换和剪裁。 此语义仅适用于基元;如果基元有多个顶点,则使用前导顶点中的值。
如果 D3D11_FEATURE_DATA_D3D11_OPTIONS3:: VPAndRTArrayIndexFromAnyShaderFeedingRasterizertrue ,则 SV _ ViewportArrayIndex 将应用到光栅器馈送的任何着色器。
uint
SV _ ShadingRate 通过底纹速率 定义一个像素着色器对 可变底纹速率为第2层 或更高级别的设备写入的像素数。 可以从像素着色器读取。 可从顶点或几何着色器写入。 uint

编写 SV 深度时的限制 _ :

  • 当) 中的 "多级 (MultisampleEnable" 为 TRUE 时,并使用像素着色器) (写入深度值时,将在 深度测试中使用已写出的单个值; 因此,在进行多级采样时,能够以更高的分辨率呈现基元边缘。 _ _
  • 使用动态流控制时,在编译时无法确定在某些路径中写入 SV 深度的着色器是否 _ 能 _ 在每次执行时都编写 sv 深度。 _当声明的结果为未定义的行为时,如果无法写入 SV Depth (这可能包括或不包括丢弃像素) 。
  • 所有 float32 值(包括 +/-INF 和 NaN)都可以写入 SV _ 深度。
  • _当执行双重源颜色混合时,写入 SV 深度仍有效。

从 Direct3D 9 迁移到 Direct3D 10 及更高版本

将代码从 Direct3D 9 迁移到 Direct3D 10 和更高版本时,应考虑以下问题:

映射到 Direct3D 9 语义

某些 Direct3D 10 和更高版本语义直接映射到 Direct3D 9 语义。

Direct3D 10 语义 Direct3D 9 等效语义
SV _ 深度 DEPTH
SV _ 位置 POSITION
SV _ 目标 COLOR

[!]Direct3D 9 开发人员注意:对于 Direct3D 9 目标,着色器语义必须映射到有效的 Direct3D 9 语义。 为了向后兼容 POSITION0 (及其变量名) 被视为 SV _ 位置,颜色被视为 sv _ 目标。

Direct3D 9 VPOS 和 Direct3D 10 SV _ 位置

D3D10 语义 SV _ 位置提供了类似的功能,可用于 Direct3D 9 着色器模型 3 VPOS 语义。 例如,在 Direct3D 9 中,以下语法用于使用屏幕空间坐标的像素着色器:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

添加了用于着色器模型3支持的 VPOS,以指定屏幕空间坐标,因为位置语义适用于对象空间坐标。

在 Direct3D 10 和更高版本中, _ 当在像素着色器的上下文中使用时,SV 位置语义 () 指定屏幕空间坐标 (偏移量为 0.5) 。 因此,在不考虑0.5 偏移的情况下,Direct3D 9 着色器会大致等效 () :

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

从 Direct3D 9 迁移到 Direct3D 10 及更高版本时,在翻译着色器时需要注意这一点。

HLSL 中的用户剪辑平面

从 Windows 8 开始,你可以在 HLSL 函数声明中使用 clipplanes 函数特性而不是 SV _ ClipDistance,使你的着色器适用于 功能级别9 _ x 以及功能级别10和更高版本。 有关详细信息,请参阅 功能级别9硬件上的用户剪辑平面