繁体   English   中英

Directx11 Texture2D格式

[英]Directx11 Texture2D formats

由于某些原因,在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

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

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

DXGI_FORMAT_R32G32B32_FLOAT对渲染目标的支持是可选的: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ff471325( DXGI_FORMAT_R32G32B32_FLOAT

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM