По какой-то причине я не могу указать формат 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?
Мне не нужен дополнительный поплавок в моей текстуре, поэтому я предпочел бы всего три элемента, а не четыре.
Не все аппаратные средства поддерживают использование R32G32B32_FLOAT
в качестве объекта-рендера и шейдер-ресурса (необязательно). Вы можете проверить, поддерживает ли оборудование формат для этих целей, вызывая CheckFormatSupport
. Если это сработает на одном и том же оборудовании с OpenGL, это, вероятно, означает, что OpenGL заполняет ресурс до полного 4-канального варианта за кулисами.
Поддержка DXGI_FORMAT_R32G32B32_FLOAT
для целей рендеринга является необязательной: http://msdn.microsoft.com/en-us/library/windows/desktop/ff471325(v=vs.85).aspx#RenderTarget
Если вы считаете, что этот формат должен поддерживаться вашим устройством, тогда включите отладочный вывод, как предлагал MooseBoys. Это должно объяснить, почему вы получаете E_INVALIDARG
.
R32G32B32A32
и вручную упаковать / распаковать каналы (например, o0.xyz = pos.xyz; o0.w = tex.u; o1.x = tex.v; o1.yzw = norm;
)