Directx 如何使用D3D11_格式_支持

Directx 如何使用D3D11_格式_支持,directx,dxgi,Directx,Dxgi,我想为我的阴影应用PCF,为此我需要将阴影贴图纹理格式设置为DXGI\u format\u R24\u UNORM\u X8\u TYPELESS。设置后,我无法运行我的程序,它崩溃没有任何错误。我想原因是我的GPU不支持这种格式,为此我想检查一下是否支持这种格式。看 这是我的密码 UINT pSup; result = device->CheckFormatSupport(DXGI_FORMAT_R24_UNORM_X8_TYPELESS,&pSup); if (result !

我想为我的阴影应用PCF,为此我需要将阴影贴图纹理格式设置为
DXGI\u format\u R24\u UNORM\u X8\u TYPELESS
。设置后,我无法运行我的程序,它崩溃没有任何错误。我想原因是我的GPU不支持这种格式,为此我想检查一下是否支持这种格式。看

这是我的密码

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\u格式\u支持\u着色器\u样本\u比较
D3D11\u格式\u支持\u渲染\u目标
D3D11\u格式\u支持\u深度\u模具
。 另请参见

我无法相信这一点:“设置后,我无法运行我的程序,它崩溃时没有任何错误”

在调试模式下运行并逐步检查程序在哪一行崩溃

device->CheckFormatSupport(DXGI_FORMAT_R24_UNORM_X8_TYPELESS,&pSup);
Windows说该函数对值进行OR运算

因此,您只需要提供所需的数据和D3D11格式支持。 例如,检查my 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_格式_R24_UNORM_X8_无类型作为格式

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

  • 纹理的DXGI_格式_R32_无类型
  • 深度模板的DXGI_格式_D32_浮点
  • ShaderResourceView的DXGI_格式_R32_浮点

祝你好运。

我检查了,程序未能创建渲染目标,因为无法使用任何无类型格式创建渲染目标。我使用render target for render to texture技术这是真的,render target、depthstencil和ShaderResourceView都是视图,并且视图都是完全类型化的。他们必须知道目标正在写的是哪种格式,或者你正在读的是哪种格式。纹理的格式可能是无类型的,因为如何解释纹理的值取决于您自己(即使用特定的shaderresource视图)。只是一个想法。您可能有一个无类型格式的纹理,因此该纹理包含任何字节和位。因此,可能需要创建两个SRV,一个将字节数据解释为UNORM,另一个将数据解释为FLOAT。