列挙せずに (ビット/ピクセル) 値に変換するDXGI_FORMAT
にはどうすればよいですか? bpp
(形式を参照)
例えば:
DXGI_FORMAT_R10G10B10A2_UNORM -> 32
DXGI_FORMAT_B5G5R5A1_UNORM -> 16
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
ます (ただし、それはほとんどありません)。
変換を実行するためのユーティリティはありません。ほとんどの 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;
}
}