【发布时间】: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