Directx11 Texture2D格式

时间:2014-07-26 20:56:01

标签: c++ directx directx-11

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

    // 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中创建2d纹理时使用DXGI_FORMAT_R32G32B32_FLOAT

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

如果您认为您的设备应支持此格式,请打开MooseBoys建议的调试输出。这可以解释为什么你得到E_INVALIDARG