像素着色器中 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 Assembler、Tesselator、Stream Output、Rasterizer 和 Output Merger。这五个阶段根据提供给 Direct3D 的特定信息对输入数据进行各种更改。
你的问题涉及第四阶段,Rasterizer。此阶段获取您尝试渲染的 3D 几何体的坐标,并生成将受渲染操作影响的像素坐标。这些像素坐标被传递给像素着色器,每个生成的像素着色器 运行 一次。顶点着色器创建的原始坐标已被光栅化器消耗。
如果您需要将深度值传递给像素着色器,您可以通过自定义语义提供该信息,或者尝试从值 SV_Depth
访问它。
您可以找到有关管道阶段的更多信息 here。
嗨,我是 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 Assembler、Tesselator、Stream Output、Rasterizer 和 Output Merger。这五个阶段根据提供给 Direct3D 的特定信息对输入数据进行各种更改。
你的问题涉及第四阶段,Rasterizer。此阶段获取您尝试渲染的 3D 几何体的坐标,并生成将受渲染操作影响的像素坐标。这些像素坐标被传递给像素着色器,每个生成的像素着色器 运行 一次。顶点着色器创建的原始坐标已被光栅化器消耗。
如果您需要将深度值传递给像素着色器,您可以通过自定义语义提供该信息,或者尝试从值 SV_Depth
访问它。
您可以找到有关管道阶段的更多信息 here。