2016-10-31 20 views
0

DXGI_FORMATbpp(ビットごとのビット)値に列挙しないでどのように変換できますか?DXGI_FORMATをbppに変換する

例えば(formatsを参照してください)。:

DXGI_FORMAT_R10G10B10A2_UNORM -> 32 
DXGI_FORMAT_B5G5R5A1_UNORM -> 16 

答えて

2

DirectXTexは、このユーティリティ機能を実装しています。は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列挙型は、この規則を変更し、破壊しないという仮定に依存しています。

関連する問題