在阅读并尝试将How to enable Hardware Percentage Closer Filtering?的建议应用到我的像素着色器后,我在调试时得到了一些非常奇怪的结果 - 因为所有像素都具有非常低的RGB值,尽管着色器返回了更大的RGB { {1}}值。
此问题仅在使用硬件(GPU)时表现出来,并且在强制WARP(通过DirectX控制面板)时表现正常。我认为这是一个驱动程序问题,但在两台不同的计算机上进行了测试,一台使用移动nVidia GPU,另一台使用台式机AMD卡,并且两者的行为相同 - 它只能按预期的方式使用WARP。
查看调试Pixel Shader的以下屏幕截图,我认为这些屏幕截图可以解释我遇到的问题:
在Pixel Shader RGB值和结果值的“图形像素历史记录”中查看返回值 - 并在右侧 - 它们如何变得如此不同?几乎除以3因素。
现在,看看相同的调试 - 在类似的阴影像素上 - 运行相同的着色器时 - 现在只使用WARP而不是在GPU上运行:
正如您所看到的,值几乎相同 - 我认为差异很大是因为渲染目标是每通道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中表现如预期。
有人可以给我一些建议,还有什么可以检查以进一步调试这种情况吗?
答案 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设备调试以确定您的执行是否处于损坏或错误状态非常有用。