首页 > 解决方案 > 像素着色器中 SV_POSITION 的 z 分量

问题描述

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

所以我的像素着色器正常从 SV_POSITION 输入(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
}

在此处输入图像描述 在此处输入图像描述 事实证明,所有 obj 都显示为红色,除非我将相机真正靠近它们。与我预期的结果正好相反。

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

任何意见,将不胜感激。

标签: shaderdirectx-11semanticsdepth

解决方案


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

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

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

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

您可以在此处找到有关管道阶段的更多信息。


推荐阅读