DirectX 11 像素着色器 SV_POSITION 是什么?

DirectX 11 Pixel Shader What Is SV_POSITION?

我正在学习 DirectX 11 的 HLSL,我想知道 SV_POSITION 究竟是什么,即顶点着色器的输出和像素着色器的输入。

1:这是屏幕上每个像素的 x、y、z 还是物体的 x、y、z?

2:为什么是4个32bit的浮点数?

3:顶点输出需要这个系统变量吗?

谢谢!

顶点着色器阶段只有一个必需的输出:顶点的位置。然后固定功能光栅器使用该值来计算正在绘制的像素并为每个像素调用像素着色器。这就是系统值语义 SV_Position 在顶点着色器的输出上指示的内容。像素着色器实际上不需要将像素位置作为输入,但如果有用的话它可以。输入布局还必须有一个顶点着色器的位置,它也使用 SV_Position 语义。

典型的设置是:

  • Tnput 布局描述了世界 space 中顶点的位置,表示为 SV_Position。输入布局描述了数据的格式。

例如:

D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
  • 顶点着色器输入从输入汇编器接收信息,由顶点缓冲区的输入布局解码,也可选择使用索引缓冲区。无论位置采用何种格式,通常都会将其转换为 float 以供着色器使用。

  • 顶点着色器必须生成输出顶点位置,再次由 SV_Position 指示。这是 (-1, -1)(1, 1) 范围内标准化坐标中像素的 (x, y) 位置。 z 是标准化范围 01 中的深度位置(用于深度缓冲区)。

例如:

float4 VS( float4 Pos : SV_Position ) : SV_Position
{
    return Pos;
}
  • 像素着色器可以选择占据位置,但不是必须的。 (x,y) 在像素坐标中。使用 D3D11_VIEWPORT.

  • 中提供的视口状态将顶点输出 ('clip space') 转换为像素
  • 像素着色器必须生成标记为 SV_Targetfloat4 结果。

例如:

// We can omit the position
float4 PS() : SV_Target
{
    return float4( 1.0f, 1.0f, 0.0f, 1.0f );
}

// Or you can take it as input if that's helpful
float4 PS( float4 Pos : SV_Position ) : SV_Target
{
    return float4( 1.0f, 1.0f, 0.0f, 1.0f );
}

从技术上讲,顶点着色器不必将位置作为输入。使用 Shader Model 4.0 或更好的硬件,您可以使用 SV_VertexId 在顶点着色器中自行生成四边形的角,代码如下,不使用任何输入布局、顶点缓冲区或索引缓冲区。当然,它仍然必须为像素着色器生成输出位置。

VSInputTx VSQuad(uint vI : SV_VertexId)
{
    VSInputTx vout;

    float2 texcoord = float2(vI & 1, vI >> 1);
    vout.TexCoord = texcoord;

    vout.Position = float4((texcoord.x - 0.5f) * 2, -(texcoord.y - 0.5f) * 2, 0, 1);
    return vout;
}

Note that you can use the older Direct3D 9 POSITION semantic in pretty much any place that you can use the new SV_Position (or SV_POSITION) semantic. The only requirement is that you have to be consistent between the input layout and the vertex shader input. Otherwise it will fail to bind.

由于您是 DirectX 的新手,我建议您看一下 DirectX Tool Kit and in particular the built-in shader source

来自 MSDN link https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics#direct3d-9-vpos-and-direct3d-10-sv_position

SV_Position指的是屏幕space坐标。

这回答了悬而未决的问题。