DirectX11:插入 3d 纹理时出错

DirectX11: error in interpolating a 3d texture

在 DirectX11 中作为像素着色器编写的体素光线追踪器中,我使用 3d 纹理来存储每个体素的光信息。

但是,当我从这个 SamplerState (Image) 切换时

SamplerState sam3DPoint
{
    Filter = MIN_MAG_MIP_POINT;
    AddressU = Border;
    AddressV = Border;
    AddressW = Border;
    BorderColor = float4(0, 0, 0, 0);
};

到这个 (Image)

SamplerState sam3DLinear
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Border;
    AddressV = Border;
    AddressW = Border;
    BorderColor = float4(0, 0, 0, 0);
};

光照数据采样不正确。

我使用 DXGI_FORMAT_R32G32B32_FLOAT 作为 3d 纹理的格式。

奇怪的是,这个错误只有在我从 Nvidia 显卡换成 AMD FirePro 后才会出现。

我发现错误:AMD卡不支持R32G32B32_FLOAT纹理格式的插值。我必须将它转换为 R32G32B32A32_FLOAT 纹理。

根据您的 Direct3D Feature Level,您需要检查一些格式以查看您的硬件是否真的支持它们用于特定用例。与 Direct3D 9 不同,您不必检查每种格式,因为根据您的功能级别,大多数格式都是必需的。如果在功能级别 x 上需要它,那么它在功能级别 x + n 上可用。

可以在 DXGI 文档的 MSDN 中找到完整的支持图表。

一般来说R32G32B32_FLOAT有点奇怪。许多硬件设计要求数据为 8 位、16 位、32 位、64 位或 128 位。因此,当用作纹理时,有时 96 位格式会作为平面格式实现,因此有一些限制。它始终可以用作顶点缓冲区格式(对 float3 数据的使用非常普遍)。

对于 10level9 特征级别(即 D3D_FEATURE_LEVEL_9_1D3D_FEATURE_LEVEL_9_2D3D_FEATURE_LEVEL_9_3),R32G32B32_FLOAT 只能用于顶点缓冲区。

使用 D3D_FEATURE_LEVEL_10_0 或更高的硬件,R32G32B32_FLOAT 超出顶点缓冲区的各种用途是可选的,必须通过方法 CheckFormatSupport.

明确检查

D3D_FEATURE_LEVEL_11_0 或更高版本对此格式有更多必需的支持案例,但仍有一些可选的案例必须明确检查,特别是作为具有任何过滤器组合的纹理采样,将其用作渲染目标、自动生成 mipmap,或将其用作可混合渲染目标。即使 D3D_FEATURE_LEVEL_12_1.

也不需要完全支持这种格式