如何使用 D3D11_FORMAT_SUPPORT

How to work with D3D11_FORMAT_SUPPORT

我想为我的阴影应用 PCF,为此我需要将我的阴影贴图纹理格式设置为 DXGI_FORMAT_R24_UNORM_X8_TYPELESS。设置后我不能 运行 我的程序,它没有任何错误地崩溃了。我认为原因是我的 GPU 不支持该格式,为此我想检查格式支持。参见 enter link description here

这是我的代码

UINT pSup;
result = device->CheckFormatSupport(DXGI_FORMAT_R24_UNORM_X8_TYPELESS,&pSup);
if (result != S_OK)
{
    MessageBox(NULL, L"Dont support that format", L"Error", MB_OK);
}

但是如何使用 pSup。我需要检查它是否支持 D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISOND3D11_FORMAT_SUPPORT_RENDER_TARGETD3D11_FORMAT_SUPPORT_DEPTH_STENCIL。 另见 enter link description here

我简直不敢相信:"After setting I cannot run my program , it crashes without any errors"

运行在Debug模式下,一步步查看程序崩溃在哪一行。

device->CheckFormatSupport(DXGI_FORMAT_R24_UNORM_X8_TYPELESS,&pSup);

Windows 表示函数对值进行或运算。

所以您只需要 AND 您想要的 D3D11_FORMAT_SUPPORT。 例如,检查我的 depthstencil 和 RenderTargetView 是否支持给定格式:

if(pSup & D3D11_FORMAT_SUPPORT_RENDER_TARGET)
{
    //render target supports that type
}
if(pSup & D3D11_FORMAT_SUPPORT_DEPTH_STENCIL)
{
   //depth stencil supports that type
}

回到你的问题,我不认为这是你硬件的支持问题。你在谈论阴影和PCF。所以我认为你不需要模板位。所以不要使用 DXGI_FORMAT_R24_UNORM_X8_TYPELESS 作为格式。

渲染阴影贴图时,您需要尽可能高的精度,因此请使用:

  • DXGI_FORMAT_R32_TYPELESS 纹理
  • DXGI_FORMAT_D32_FLOAT 深度模板
  • DXGI_FORMAT_R32_FLOAT 对于 ShaderResourceView

祝你好运。