DirectX11:插入3d纹理时出错

时间:2016-02-11 10:15:04

标签: 3d directx textures directx-11

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

但是,当我从此SamplerState(Image

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

到这个(Image

{{1}}

未正确采样灯光数据。

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

奇怪的是,这个错误只发生在我从Nvidia显卡改为AMD FirePro之后。

2 个答案:

答案 0 :(得分:0)

我发现错误:AMD卡不支持插入R32G32B32_FLOAT纹理格式。我不得不将其转换为R32G32B32A32_FLOAT纹理。

答案 1 :(得分:0)

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

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

一般来说,R32G32B32_FLOAT有点奇怪的格式。许多硬件设计要求数据为8位,16位,32位,64位或128位。因此,当用作纹理时,96位格式有时被实现为平面格式,因此具有一些限制。它总是可以用作顶点缓冲区格式(它极其常用于float3数据)。

对于10级9级功能级别(例如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也不需要完全支持此格式。