【问题标题】:DirectX11: error in interpolating a 3d textureDirectX11:插入 3d 纹理时出错
【发布时间】:2016-02-11 10:15:03
【问题描述】:

在体素光线追踪器中,在 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 之后。

【问题讨论】:

    标签: 3d directx textures directx-11


    【解决方案1】:

    根据您的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 或更高版本为此格式提供了更多必需的支持案例,但仍有一些可选的支持案例需要明确检查,特别是作为具有任何过滤器组合的纹理进行采样,将其用作渲染目标,自动-gen mipmaps,或将其用作可混合渲染目标。即使D3D_FEATURE_LEVEL_12_1 也不需要完全支持这种格式。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 2013-05-07
        • 2016-03-24
        相关资源
        最近更新 更多