HLSL:最终像素颜色与像素着色器

时间:2017-02-23 09:16:38

标签: directx shader directx-11 direct3d hlsl

在阅读并尝试将How to enable Hardware Percentage Closer Filtering?的建议应用到我的像素着色器后,我在调试时得到了一些非常奇怪的结果 - 因为所有像素都具有非常低的RGB值,尽管着色器返回了更大的RGB { {1}}值。

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

查看调试Pixel Shader的以下屏幕截图,我认为这些屏幕截图可以解释我遇到的问题:

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

在Pixel Shader RGB值和结果值的“图形像素历史记录”中查看返回值 - 并在右侧 - 它们如何变得如此不同?几乎除以3因素。

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

正如您所看到的,值几乎相同 - 我认为差异很大是因为渲染目标是每通道8位而float4是4字节(32位)。

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

我实现了一个16抽头PCF - 使用float函数取16个样本而不是使用Sample函数,并在着色器中自己与目标值进行比较 - 以确定范围像素应该被遮蔽。 在阅读上面提到的问题时 - 我修改了我的着色器以使用SampleCmpLevelZero,这就是我的问题出现时,我的着色器仅在WARP中表现如预期。

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

1 个答案:

答案 0 :(得分:1)

启用D3D设备调试后 - 按照here提供的宝贵指示 - 我收到以下消息 - 因此找出了我的问题的原因:

  

D3D11错误:ID3D11DeviceContext :: DrawIndexed:着色器资源   Pixel Shader单元的插槽1中的视图使用格式   (R16_FLOAT)。此格式不支持' SampleCmp'要么   ' SampleCmpLevelZero',其中至少有一个正在使用   着色器资源。如果着色器,此不匹配无效   实际上使用视图(例如,由于着色器代码,它不会被跳过   分枝)。 [执行错误#372:   DEVICE_DRAW_RESOURCE_FORMAT_SAMPLE_C_UNSUPPORTED]

这是对我的深度纹理的影响,为此我设置了DXGI_FORMAT_R16_FLOAT选项。更改为DXGI_FORMAT_R32_FLOAT已修复此问题,并允许我通过SampleCmpLevelZero启用PCF。

我认为道德是,启用DirectX设备调试以确定您的执行是否处于损坏或错误状态非常有用。