Mik*_*050 4 hlsl directx-11 pixel-shader vertex-shader
我正在学习DirectX 11的HLSL,我想知道SV_POSITION是什么,它是Vertex Shader的输出,还是Pixel Shader的输入。
1:是屏幕上每个像素或对象的x,y,z?
2:为什么有4个32位浮点数?
3:顶点输出需要这个系统变量吗?
谢谢!
顶点着色器阶段只有一个必需的输出:顶点的位置。然后,固定功能栅格化器使用此值来计算要绘制的像素,并为每个像素调用像素着色器。这就是系统值语义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 },
};
Run Code Online (Sandbox Code Playgroud)
顶点着色器输入从输入汇编器接收该信息,该信息由输入布局从顶点缓冲区解码,并且还可以选择使用索引缓冲区。无论位置采用哪种格式,通常都将其转换为float供着色器使用。
顶点着色器必须产生输出顶点位置,再次由表示SV_Position。这是(x, y)在范围归一化坐标的像素的位置(-1, -1)来(1, 1)。的z是在归一化范围内的深度位置(用于深度缓冲器)0来1。
例如:
float4 VS( float4 Pos : SV_Position ) : SV_Position
{
return Pos;
}
Run Code Online (Sandbox Code Playgroud)
像素着色器可以选择采用该位置,但不是必须的。的(x,y)像素坐标。通过使用中提供的视口状态,将顶点输出(“剪辑空间”)转换为像素D3D11_VIEWPORT。
像素着色器必须产生float4标记为的结果SV_Target。
例如:
// 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 );
}
Run Code Online (Sandbox Code Playgroud)
从技术上讲,顶点着色器不必将位置作为输入。使用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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您几乎可以
POSITION在任何可以使用新SV_Position(或SV_POSITION)语义的地方使用较旧的Direct3D 9 语义。唯一的要求是输入布局和顶点着色器输入之间必须保持一致。否则它将无法绑定。
当您不熟悉DirectX时,建议您看一下DirectX Tool Kit,尤其是内置的着色器源。
| 归档时间: |
|
| 查看次数: |
5998 次 |
| 最近记录: |