【问题标题】:Directx11 Texture2D formatsDirectx11 Texture2D 格式
【发布时间】:2014-07-26 20:56:00
【问题描述】:

由于某种原因,在directx11 中创建2d 纹理时,我无法指定DXGI_FORMAT_R32G32B32_FLOAT 格式。但是,我可以在 OpenGL 中做得很好。使用DXGI_FORMAT_R32G32B32A32_FLOAT 时也可以正常工作。我将这些纹理用作 gbuffer 的渲染目标。

    // create gbuffer textures/rendertargets
    D3D11_TEXTURE2D_DESC textureDesc;
    ZeroMemory(&textureDesc, sizeof(D3D11_TEXTURE2D_DESC));
    textureDesc.Width = swapChainDesc.BufferDesc.Width;
    textureDesc.Height = swapChainDesc.BufferDesc.Height;
    textureDesc.ArraySize = 1;
    textureDesc.MipLevels = 1;
    textureDesc.Format = DXGI_FORMAT_R32G32B32_FLOAT;    <----- dosn't like this; returns E_INVALIDARG
    textureDesc.SampleDesc.Count = 1;
    textureDesc.Usage = D3D11_USAGE_DEFAULT;
    textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;

    for (uint32_t index = 0; index < GBuffer::GBUFFER_NUM_RENDERTARGETS; index++) 
    {
        DXCALL(device->CreateTexture2D(&textureDesc, NULL, &mGeometryTextures[index]));
        DXCALL(device->CreateRenderTargetView(mGeometryTextures[index], NULL, &mRenderTargets[index]));
    }

为什么在directx 11 中创建二维纹理时不能使用DXGI_FORMAT_R32G32B32_FLOAT

我的纹理中不需要额外的浮点数,因此我宁愿只有三个元素而不是四个。

【问题讨论】:

  • 您的硬件是哪个feature level?您可以在功能级别 9.2 或更高版本上使用“DXGI_FORMAT_R16G16B16A16_FLOAT”或在功能级别 9.3 或更高版本上使用“DXGI_FORMAT_R32G32B32A32_FLOAT”。 “R32G32B32_FLOAT”可能不允许特定操作,因为即使是最新一代的 DirectX 硬件,这些操作也是可选的。

标签: c++ directx directx-11


【解决方案1】:

并非所有硬件都支持使用R32G32B32_FLOAT 作为渲染目标和着色器资源(它是可选的)。您可以通过调用CheckFormatSupport 来验证硬件是否支持这些用途的格式。如果它在与 OpenGL 相同的硬件上成功,这可能意味着 OpenGL 正在将资源填充到幕后的完整 4 通道变体。

【讨论】:

    【解决方案2】:

    DXGI_FORMAT_R32G32B32_FLOAT 对渲染目标的支持是可选的:http://msdn.microsoft.com/en-us/library/windows/desktop/ff471325(v=vs.85).aspx#RenderTarget

    如果您认为您的设备应该支持这种格式,请按照 MooseBoys 的建议打开调试输出。这应该可以解释为什么您会收到 E_INVALIDARG

    【讨论】:

    • 你能推荐一种更好的格式在这种情况下使用吗?我将它用于 gbuffer 纹理,例如漫反射、法线、位置等
    • @KaiserJohaan 你应该使用R32G32B32A32 并手动打包/解包频道(例如o0.xyz = pos.xyz; o0.w = tex.u; o1.x = tex.v; o1.yzw = norm;
    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多