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

10

我正在学习用于DirectX 11的HLSL,想知道在顶点着色器中作为输出,在像素着色器中作为输入的SV_POSITION到底是什么。

1:这是屏幕上每个像素的x、y、z坐标还是对象的坐标?

2:为什么要使用4个32位浮点数?

3:对于顶点输出,是否需要此系统变量?

谢谢!

2个回答

16
顶点着色器阶段只有一个必需的输出:顶点位置。固定功能光栅化器使用该值计算正在绘制哪些像素并为每个像素调用像素着色器。这就是系统值语义SV_Position在顶点着色器输出上的含义。像素着色器实际上不需要将像素位置作为输入,但如果有用的话可以使用。输入布局还必须具有使用SV_Position语义的顶点着色器的位置。
通常的设置如下:
  • 输入布局描述了以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。这是像素在规范化坐标中的(x,y)位置,范围为(-1,-1)(1,1)z是深度位置(用于深度缓冲区),范围为规范化01

例如:

float4 VS( float4 Pos : SV_Position ) : SV_Position
{
    return Pos;
}
  • 像素着色器可以选择性地获取位置,但不一定需要。 (x,y) 是以像素为单位的坐标。顶点输出(“裁剪空间”)通过使用在D3D11_VIEWPORT中提供的视口状态来转换为像素。

  • 像素着色器必须生成一个标记为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;
}

请注意,您可以在几乎任何可以使用新的SV_Position(或SV_POSITION)语义的地方使用旧的Direct3D 9 POSITION语义。唯一的要求是您必须在输入布局和顶点着色器输入之间保持一致。否则,它将无法绑定。
由于您是DirectX的新手,我建议您查看DirectX Tool Kit,特别是built-in shader source

谢谢!然而,我仍然感到困惑……Pixel Shader中的float4 SV_Position是几何体的像素位置还是屏幕的像素位置?或者它只是顶点输出SV_Position(它们是相同的)?因为Pixel Shader正在输出颜色,这个颜色是2D屏幕上的颜色吗? - Mike5050
1
这取决于你正在绘制什么。如果你正在绘制一个三角形,顶点着色器将为每个三角形的三个角运行一次,而像素着色器将为三角形接触到的每个像素运行一次。顶点着色器的输出被发送到光栅化硬件,该硬件负责从所有状态计算像素位置。然后它为生成的每个像素调用像素着色器。 - Chuck Walbourn
谢谢!像素着色器(三角形)的SV_Position,仍然是3D空间吗?X,Y,Z,W值是什么?抱歉,有这么多未解答的问题!编辑:我假设它只是屏幕位置?只想确保我正确理解,因为我读过的书...不是很清楚。例如:一本书说:光栅化程序生成片段(什么是片段?),像素着色器对此片段进行处理。它没有解释片段是什么...只是像素着色器必须输出颜色。 - Mike5050
我会接受你的答案,但我想我需要再提一个关于这个Fragment的问题,以及它的含义和工作原理。 - Mike5050

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接