1

列挙せずに (ビット/ピクセル) 値に変換するDXGI_FORMATにはどうすればよいですか? bpp(形式を参照)

例えば:

DXGI_FORMAT_R10G10B10A2_UNORM -> 32
DXGI_FORMAT_B5G5R5A1_UNORM -> 16
4

3 に答える 3

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ます (ただし、それはほとんどありません)。

于 2016-11-01T07:13:12.207 に答える
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;
  }
}
于 2016-10-31T19:46:03.607 に答える