[英]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.