Форматы Directx11 Texture2D

0

По какой-то причине я не могу указать формат DXGI_FORMAT_R32G32B32_FLOAT при создании текстуры 2d в directx11. Однако, я могу сделать это просто отлично в OpenGL. Он также отлично работает при использовании DXGI_FORMAT_R32G32B32A32_FLOAT. Я использую эти текстуры как rendertargets для 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]));
    }

Почему я не могу использовать DXGI_FORMAT_R32G32B32_FLOAT при создании 2d-текстуры в directx 11?

Мне не нужен дополнительный поплавок в моей текстуре, поэтому я предпочел бы всего три элемента, а не четыре.

  • 0
    Какой уровень функциональности вашего оборудования? Вы можете использовать «DXGI_FORMAT_R16G16B16A16_FLOAT» на уровне возможностей 9.2 или более поздней версии или «DXGI_FORMAT_R32G32B32A32_FLOAT» на уровне функций 9.3 или более поздней версии. Отдельные операции могут быть запрещены для «R32G32B32_FLOAT», так как они необязательны даже для оборудования DirectX текущего поколения.
Теги:
directx
directx-11

2 ответа

3
Лучший ответ

Не все аппаратные средства поддерживают использование R32G32B32_FLOAT в качестве объекта-рендера и шейдер-ресурса (необязательно). Вы можете проверить, поддерживает ли оборудование формат для этих целей, вызывая CheckFormatSupport. Если это сработает на одном и том же оборудовании с OpenGL, это, вероятно, означает, что OpenGL заполняет ресурс до полного 4-канального варианта за кулисами.

1

Поддержка DXGI_FORMAT_R32G32B32_FLOAT для целей рендеринга является необязательной: http://msdn.microsoft.com/en-us/library/windows/desktop/ff471325(v=vs.85).aspx#RenderTarget

Если вы считаете, что этот формат должен поддерживаться вашим устройством, тогда включите отладочный вывод, как предлагал MooseBoys. Это должно объяснить, почему вы получаете E_INVALIDARG.

  • 0
    Можете ли вы предложить лучший формат для использования в этом случае? Я использую его для текстур gbuffer, таких как diffuse, normals, position и т.д.
  • 0
    @KaiserJohaan Вы должны использовать R32G32B32A32 и вручную упаковать / распаковать каналы (например, o0.xyz = pos.xyz; o0.w = tex.u; o1.x = tex.v; o1.yzw = norm; )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню