HLSL:最终像素颜色与像素着色器的计算 return 值不同

HLSL: Final pixel color is different than the calculated return value of the pixel shader

在阅读并尝试将 How to enable Hardware Percentage Closer Filtering? 的建议应用到我的像素着色器之后,我在调试时得到了一些非常奇怪的结果 - 尽管着色器 [=44] 所有像素的 RGB 值都非常低=]编辑了一些更大的 RGB float4 值。

此问题仅在使用硬件 (GPU) 时出现,在强制 WARP(通过 DirectX 控制面板)时表现正常。我认为这是一个驱动程序问题,但在两台不同的计算机上进行了测试,一台使用移动 nVidia GPU,另一台使用桌面 AMD 卡,并且两者的行为相同 - 它仅按预期与 WARP 一起工作。

查看以下调试像素着色器的屏幕截图,我认为它们对我遇到的问题非常有用:

使用常规硬件调试像素着色器 运行:

查看像素着色器 RGB 值和结果值的 return 值 - 以及右侧的 "Graphics Pixel History" - 它们为何如此不同?几乎除以 3 个因子。

现在,看看相同的调试 - 在类似的阴影像素上 - 当 运行ning 相同的着色器时 - 现在只是在 GPU 上使用 WARP 而不是 运行ning:

如您所见,这些值几乎相同 - 我认为细微差别是因为渲染目标是每通道 8 位,而 float 是 4 字节(32 位)。

我以前版本的着色器受到此博客 post 和片段的启发,并且:https://takinginitiative.wordpress.com/2011/05/25/directx10-tutorial-10-shadow-mapping-part-2/

我实现了一个 16-tap PCF - 使用 Sample 函数而不是使用 SampleCmpLevelZero 函数获取 16 个样本并自己在着色器中与目标值进行比较 - 用于决定像素应该被遮蔽的程度。 阅读上述问题后 - 我修改了我的着色器以使用 SampleCmpLevelZero,这时我的问题出现了,我的着色器仅按 WARP 的预期运行。

有人可以给我一些建议,告诉我还有什么要检查以进一步调试这种情况吗?

启用 D3D 设备调试后 - 按照 here 的宝贵说明 - 我收到以下消息 - 并因此找到了我的问题的原因:

D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: The Shader Resource View in slot 1 of the Pixel Shader unit is using the Format (R16_FLOAT). This format does not support 'SampleCmp' or 'SampleCmpLevelZero', at least one of which is being used on the Resource by the shader. This mismatch is invalid if the shader actually uses the view (e.g. it is not skipped due to shader code branching). [ EXECUTION ERROR #372: DEVICE_DRAW_RESOURCE_FORMAT_SAMPLE_C_UNSUPPORTED]

这是参考我的深度纹理,为此我设置了 DXGI_FORMAT_R16_FLOAT 选项。更改为 DXGI_FORMAT_R32_FLOAT 已解决问题并允许我通过 SampleCmpLevelZero.

启用 PCF

我想这说明启用 DirectX 设备调试以查明您的执行是否处于损坏或错误状态非常有用。