2016-10-31 27 views
0

如何在不枚舉的情況下將DXGI_FORMAT轉換爲bpp(每像素位數)值? (見formats將DXGI_FORMAT轉換爲bpp

例如爲:

DXGI_FORMAT_R10G10B10A2_UNORM -> 32 
DXGI_FORMAT_B5G5R5A1_UNORM -> 16 

回答

2

DirectXTex實現這個實用功能,我在DirectX Tool Kit內部爲DDSTextureLoader

//------------------------------------------------------------------------------------- 
// Returns bits-per-pixel for a given DXGI format, or 0 on failure 
//------------------------------------------------------------------------------------- 
_Use_decl_annotations_ 
size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) 
{ 
    switch (static_cast<int>(fmt)) 
    { 
    case DXGI_FORMAT_R32G32B32A32_TYPELESS: 
    case DXGI_FORMAT_R32G32B32A32_FLOAT: 
    case DXGI_FORMAT_R32G32B32A32_UINT: 
    case DXGI_FORMAT_R32G32B32A32_SINT: 
     return 128; 

    case DXGI_FORMAT_R32G32B32_TYPELESS: 
    case DXGI_FORMAT_R32G32B32_FLOAT: 
    case DXGI_FORMAT_R32G32B32_UINT: 
    case DXGI_FORMAT_R32G32B32_SINT: 
     return 96; 

    case DXGI_FORMAT_R16G16B16A16_TYPELESS: 
    case DXGI_FORMAT_R16G16B16A16_FLOAT: 
    case DXGI_FORMAT_R16G16B16A16_UNORM: 
    case DXGI_FORMAT_R16G16B16A16_UINT: 
    case DXGI_FORMAT_R16G16B16A16_SNORM: 
    case DXGI_FORMAT_R16G16B16A16_SINT: 
    case DXGI_FORMAT_R32G32_TYPELESS: 
    case DXGI_FORMAT_R32G32_FLOAT: 
    case DXGI_FORMAT_R32G32_UINT: 
    case DXGI_FORMAT_R32G32_SINT: 
    case DXGI_FORMAT_R32G8X24_TYPELESS: 
    case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 
    case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: 
    case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: 
    case DXGI_FORMAT_Y416: 
    case DXGI_FORMAT_Y210: 
    case DXGI_FORMAT_Y216: 
     return 64; 

    case DXGI_FORMAT_R10G10B10A2_TYPELESS: 
    case DXGI_FORMAT_R10G10B10A2_UNORM: 
    case DXGI_FORMAT_R10G10B10A2_UINT: 
    case DXGI_FORMAT_R11G11B10_FLOAT: 
    case DXGI_FORMAT_R8G8B8A8_TYPELESS: 
    case DXGI_FORMAT_R8G8B8A8_UNORM: 
    case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: 
    case DXGI_FORMAT_R8G8B8A8_UINT: 
    case DXGI_FORMAT_R8G8B8A8_SNORM: 
    case DXGI_FORMAT_R8G8B8A8_SINT: 
    case DXGI_FORMAT_R16G16_TYPELESS: 
    case DXGI_FORMAT_R16G16_FLOAT: 
    case DXGI_FORMAT_R16G16_UNORM: 
    case DXGI_FORMAT_R16G16_UINT: 
    case DXGI_FORMAT_R16G16_SNORM: 
    case DXGI_FORMAT_R16G16_SINT: 
    case DXGI_FORMAT_R32_TYPELESS: 
    case DXGI_FORMAT_D32_FLOAT: 
    case DXGI_FORMAT_R32_FLOAT: 
    case DXGI_FORMAT_R32_UINT: 
    case DXGI_FORMAT_R32_SINT: 
    case DXGI_FORMAT_R24G8_TYPELESS: 
    case DXGI_FORMAT_D24_UNORM_S8_UINT: 
    case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: 
    case DXGI_FORMAT_X24_TYPELESS_G8_UINT: 
    case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: 
    case DXGI_FORMAT_R8G8_B8G8_UNORM: 
    case DXGI_FORMAT_G8R8_G8B8_UNORM: 
    case DXGI_FORMAT_B8G8R8A8_UNORM: 
    case DXGI_FORMAT_B8G8R8X8_UNORM: 
    case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: 
    case DXGI_FORMAT_B8G8R8A8_TYPELESS: 
    case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: 
    case DXGI_FORMAT_B8G8R8X8_TYPELESS: 
    case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: 
    case DXGI_FORMAT_AYUV: 
    case DXGI_FORMAT_Y410: 
    case DXGI_FORMAT_YUY2: 
    case XBOX_DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: 
    case XBOX_DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: 
    case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: 
     return 32; 

    case DXGI_FORMAT_P010: 
    case DXGI_FORMAT_P016: 
    case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: 
    case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: 
    case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: 
    case WIN10_DXGI_FORMAT_V408: 
     return 24; 

    case DXGI_FORMAT_R8G8_TYPELESS: 
    case DXGI_FORMAT_R8G8_UNORM: 
    case DXGI_FORMAT_R8G8_UINT: 
    case DXGI_FORMAT_R8G8_SNORM: 
    case DXGI_FORMAT_R8G8_SINT: 
    case DXGI_FORMAT_R16_TYPELESS: 
    case DXGI_FORMAT_R16_FLOAT: 
    case DXGI_FORMAT_D16_UNORM: 
    case DXGI_FORMAT_R16_UNORM: 
    case DXGI_FORMAT_R16_UINT: 
    case DXGI_FORMAT_R16_SNORM: 
    case DXGI_FORMAT_R16_SINT: 
    case DXGI_FORMAT_B5G6R5_UNORM: 
    case DXGI_FORMAT_B5G5R5A1_UNORM: 
    case DXGI_FORMAT_A8P8: 
    case DXGI_FORMAT_B4G4R4A4_UNORM: 
    case WIN10_DXGI_FORMAT_P208: 
    case WIN10_DXGI_FORMAT_V208: 
     return 16; 

    case DXGI_FORMAT_NV12: 
    case DXGI_FORMAT_420_OPAQUE: 
    case DXGI_FORMAT_NV11: 
     return 12; 

    case DXGI_FORMAT_R8_TYPELESS: 
    case DXGI_FORMAT_R8_UNORM: 
    case DXGI_FORMAT_R8_UINT: 
    case DXGI_FORMAT_R8_SNORM: 
    case DXGI_FORMAT_R8_SINT: 
    case DXGI_FORMAT_A8_UNORM: 
    case DXGI_FORMAT_AI44: 
    case DXGI_FORMAT_IA44: 
    case DXGI_FORMAT_P8: 
    case XBOX_DXGI_FORMAT_R4G4_UNORM: 
     return 8; 

    case DXGI_FORMAT_R1_UNORM: 
     return 1; 

    case DXGI_FORMAT_BC1_TYPELESS: 
    case DXGI_FORMAT_BC1_UNORM: 
    case DXGI_FORMAT_BC1_UNORM_SRGB: 
    case DXGI_FORMAT_BC4_TYPELESS: 
    case DXGI_FORMAT_BC4_UNORM: 
    case DXGI_FORMAT_BC4_SNORM: 
     return 4; 

    case DXGI_FORMAT_BC2_TYPELESS: 
    case DXGI_FORMAT_BC2_UNORM: 
    case DXGI_FORMAT_BC2_UNORM_SRGB: 
    case DXGI_FORMAT_BC3_TYPELESS: 
    case DXGI_FORMAT_BC3_UNORM: 
    case DXGI_FORMAT_BC3_UNORM_SRGB: 
    case DXGI_FORMAT_BC5_TYPELESS: 
    case DXGI_FORMAT_BC5_UNORM: 
    case DXGI_FORMAT_BC5_SNORM: 
    case DXGI_FORMAT_BC6H_TYPELESS: 
    case DXGI_FORMAT_BC6H_UF16: 
    case DXGI_FORMAT_BC6H_SF16: 
    case DXGI_FORMAT_BC7_TYPELESS: 
    case DXGI_FORMAT_BC7_UNORM: 
    case DXGI_FORMAT_BC7_UNORM_SRGB: 
     return 8; 

    default: 
     return 0; 
    } 
} 

當然,真正的問題是爲什麼你需要它?

+0

我在對話窗口中使用它們來配置圖形設置。 – Matthias

0

沒有實用程序來執行轉換對你來說,大多數3D引擎只是實現自己的一個基本的大的開關情況。此外,您列出的值是錯誤的,除非您考慮每個分量位而不是整個像素。

int DxgiFormat2Bpp(DXGI_FORMAT fmt) { 
    switch(fmt) { 
    // many cases 
    case DXGI_FORMAT_R16G16B16A16_UNORM : return 64; 
    case DXGI_FORMAT_R32G32B32A32_FLOAT : return 128; 
    default: return -1; 
    } 
} 
+0

的確,固定它。 – Matthias

1

你可以簡單地創建switch語句的函數:

int getBPP(DXGI_FORMAT format) 
{ 
    switch(format) 
    { 
    case DXGI_FORMAT_R16G16B16A16_UNORM: return 16*4; 
    case DXGI_FORMAT_R32G32B32A32_FLOAT: return 32*4; 
    //... 
    } 
} 

或者,你可以依靠的事實,一般格式是由他們的BPP分組。這不完全正確 - 例如,有多組32bpp格式,但可以使用附加條件處理。例如:

int getBPP(DXGI_FORMAT format) 
{ 
    //... 
    else if (format >= DXGI_FORMAT_R32_TYPELESS && 
      format <= DXGI_FORMAT_X24_TYPELESS_G8_UINT) 
    { 
     return 32; 
    } 
    else if (format >= DXGI_FORMAT_R9G9B9E5_SHAREDEXP && 
      format <= DXGI_FORMAT_G8R8_G8B8_UNORM) 
    { 
     return 32; 
    } 
    //... 
} 

當然,這依賴於假設DXGI_FORMAT枚舉不會改變,並打破了這個慣例(儘管,這是相當不可能的)。