像素着色器中 SV_POSITION 的 z 分量

z component of SV_POSITION in pixel shader

嗨,我是 directx 的新手,在像素着色器中苦苦挣扎 SV_POSITION。

所以我的像素着色器正常从 SV_POSITION input(float4) 获取输入 我只是猜测这个输入的 z 分量会给我这个着色器正在处理的像素的深度值。 所以我只是做了一些简单的测试。

像素着色器

float4 main(PS_INPUT input) : SV_Target
{
    float Z = input.pos.z / input.pos.w;
    if (Z<0.1f)
        return RED;

    ...//draw texture
}

事实证明,所有对象都显示为红色,除非我将相机非常靠近它们。与我预期的结果正好相反。

所以我猜测 SV_POSITION 在顶点着色器中的输出值将不同于像素着色器中相同语义的输入值???

如有任何建议,我们将不胜感激。

您猜对了 - 像素着色器的输入与顶点着色器的输出不同。 SV_Position 值有一些与之关联的特殊语义,可以防止这种情况发生。

在 Direct3D 11 中进行渲染时,在您的数据出现在屏幕上之前会发生几个流水线阶段。这些阶段大部分是可编程的,但有些阶段由系统或硬件固定。这五个固定阶段(按出现顺序)是 Input AssemblerTesselatorStream OutputRasterizerOutput Merger。这五个阶段根据提供给 Direct3D 的特定信息对输入数据进行各种更改。

你的问题涉及第四阶段,Rasterizer。此阶段获取您尝试渲染的 3D 几何体的坐标,并生成将受渲染操作影响的像素坐标。这些像素坐标被传递给像素着色器,每个生成的像素着色器 运行 一次。顶点着色器创建的原始坐标已被光栅化器消耗。

如果您需要将深度值传递给像素着色器,您可以通过自定义语义提供该信息,或者尝试从值 SV_Depth 访问它。

您可以找到有关管道阶段的更多信息 here