How to create 2D texture using DXGI format DXGI_FO

2020-05-03 09:41发布

问题:

I want to create a 1 bit per pixel monochrome texture 2D in DirectX 11 using dxgi format DXGI_FORMAT_R1_UNORM I have done trying the following but it's showing following errors:

D3D11 ERROR: ID3D11Device::CreateTexture2D: Device does not support the format R1_UNORM. [ STATE_CREATION ERROR #92: CREATETEXTURE2D_UNSUPPORTEDFORMAT] D3D11: BREAK enabled for the previous message, which was: [ ERROR STATE_CREATION #92: CREATETEXTURE2D_UNSUPPORTEDFORMAT ]

I have tried to create a texture for rendering but it's says as you seen above The "R1_UNORM" does not supported by device. So, which format should be used to create the texture 2D?

The bitmapPixels is a dynamic memory of 1 bit color array in BYTE, prepared from this algorithm which is under review Code Review: Bit Packing algorithm of 1-Bit monochrome image

D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = 32;
desc.Height = 32;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R1_UNORM;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MipLevels = 1;
desc.SampleDesc.Count = 1;
desc.MiscFlags = 0;

const D3D11_SUBRESOURCE_DATA subResourceData = {bitmapPixels, 4, 4 * desc.Height};
device->CreateTexture2D(&desc, &subResourceData, &texture2D);

回答1:

ID3D11Device::CheckFormatSupport

Get the support of a given format on the installed video device.

...

A bitfield of D3D11_FORMAT_SUPPORT enumeration values describing how the specified format is supported on the installed device. The values are ORed together.

...

D3D11_FORMAT_SUPPORT_TEXTURE2D 2D texture resources supported.

For example, these are formats supported by Intel(R) HD Graphics 620 (just randomly picked a GPU; no DXGI_FORMAT_R1_UNORM there):

DXGI_FORMAT_R32G32B32A32_TYPELESS
DXGI_FORMAT_R32G32B32A32_FLOAT
DXGI_FORMAT_R32G32B32A32_UINT
DXGI_FORMAT_R32G32B32A32_SINT
DXGI_FORMAT_R32G32B32_TYPELESS
DXGI_FORMAT_R32G32B32_FLOAT
DXGI_FORMAT_R32G32B32_UINT
DXGI_FORMAT_R32G32B32_SINT
DXGI_FORMAT_R16G16B16A16_TYPELESS
DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R16G16B16A16_UNORM
DXGI_FORMAT_R16G16B16A16_UINT
DXGI_FORMAT_R16G16B16A16_SNORM
DXGI_FORMAT_R16G16B16A16_SINT
DXGI_FORMAT_R32G32_TYPELESS
DXGI_FORMAT_R32G32_FLOAT
DXGI_FORMAT_R32G32_UINT
DXGI_FORMAT_R32G32_SINT
DXGI_FORMAT_R32G8X24_TYPELESS
DXGI_FORMAT_D32_FLOAT_S8X24_UINT
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT
DXGI_FORMAT_R10G10B10A2_TYPELESS
DXGI_FORMAT_R10G10B10A2_UNORM
DXGI_FORMAT_R10G10B10A2_UINT
DXGI_FORMAT_R11G11B10_FLOAT
DXGI_FORMAT_R8G8B8A8_TYPELESS
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
DXGI_FORMAT_R8G8B8A8_UINT
DXGI_FORMAT_R8G8B8A8_SNORM
DXGI_FORMAT_R8G8B8A8_SINT
DXGI_FORMAT_R16G16_TYPELESS
DXGI_FORMAT_R16G16_FLOAT
DXGI_FORMAT_R16G16_UNORM
DXGI_FORMAT_R16G16_UINT
DXGI_FORMAT_R16G16_SNORM
DXGI_FORMAT_R16G16_SINT
DXGI_FORMAT_R32_TYPELESS
DXGI_FORMAT_D32_FLOAT
DXGI_FORMAT_R32_FLOAT
DXGI_FORMAT_R32_UINT
DXGI_FORMAT_R32_SINT
DXGI_FORMAT_R24G8_TYPELESS
DXGI_FORMAT_D24_UNORM_S8_UINT
DXGI_FORMAT_R24_UNORM_X8_TYPELESS
DXGI_FORMAT_X24_TYPELESS_G8_UINT
DXGI_FORMAT_R8G8_TYPELESS
DXGI_FORMAT_R8G8_UNORM
DXGI_FORMAT_R8G8_UINT
DXGI_FORMAT_R8G8_SNORM
DXGI_FORMAT_R8G8_SINT
DXGI_FORMAT_R16_TYPELESS
DXGI_FORMAT_R16_FLOAT
DXGI_FORMAT_D16_UNORM
DXGI_FORMAT_R16_UNORM
DXGI_FORMAT_R16_UINT
DXGI_FORMAT_R16_SNORM
DXGI_FORMAT_R16_SINT
DXGI_FORMAT_R8_TYPELESS
DXGI_FORMAT_R8_UNORM
DXGI_FORMAT_R8_UINT
DXGI_FORMAT_R8_SNORM
DXGI_FORMAT_R8_SINT
DXGI_FORMAT_A8_UNORM
DXGI_FORMAT_R9G9B9E5_SHAREDEXP
DXGI_FORMAT_R8G8_B8G8_UNORM
DXGI_FORMAT_G8R8_G8B8_UNORM
DXGI_FORMAT_BC1_TYPELESS
DXGI_FORMAT_BC1_UNORM
DXGI_FORMAT_BC1_UNORM_SRGB
DXGI_FORMAT_BC2_TYPELESS
DXGI_FORMAT_BC2_UNORM
DXGI_FORMAT_BC2_UNORM_SRGB
DXGI_FORMAT_BC3_TYPELESS
DXGI_FORMAT_BC3_UNORM
DXGI_FORMAT_BC3_UNORM_SRGB
DXGI_FORMAT_BC4_TYPELESS
DXGI_FORMAT_BC4_UNORM
DXGI_FORMAT_BC4_SNORM
DXGI_FORMAT_BC5_TYPELESS
DXGI_FORMAT_BC5_UNORM
DXGI_FORMAT_BC5_SNORM
DXGI_FORMAT_B5G6R5_UNORM
DXGI_FORMAT_B5G5R5A1_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM
DXGI_FORMAT_B8G8R8X8_UNORM
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
DXGI_FORMAT_B8G8R8A8_TYPELESS
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_B8G8R8X8_TYPELESS
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB
DXGI_FORMAT_BC6H_TYPELESS
DXGI_FORMAT_BC6H_UF16
DXGI_FORMAT_BC6H_SF16
DXGI_FORMAT_BC7_TYPELESS
DXGI_FORMAT_BC7_UNORM
DXGI_FORMAT_BC7_UNORM_SRGB
DXGI_FORMAT_AYUV
DXGI_FORMAT_Y416
DXGI_FORMAT_NV12
DXGI_FORMAT_P010
DXGI_FORMAT_P016
DXGI_FORMAT_420_OPAQUE
DXGI_FORMAT_YUY2
DXGI_FORMAT_Y216
DXGI_FORMAT_AI44
DXGI_FORMAT_IA44
DXGI_FORMAT_P8
DXGI_FORMAT_A8P8
DXGI_FORMAT_B4G4R4A4_UNORM


回答2:

DXGI_FORMAT_R1_UNORM is not supported by any Direct3D device. It only exists for some old Direct3D 10.0-era Windows 10 GDI font interop, and is basically unused since Direct3D 10.1.