在体素光线跟踪器中,作为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之后。
答案 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_1
,D3D_FEATURE_LEVEL_9_2
或D3D_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
也不需要完全支持此格式。