2

私はフランク D. ルナの本「DirectX 10 を使用した 3D プログラミングの概要」を読んでいますが、問題の 1 つは使用から切り替えることです。

D3DXCOLOR カラー (128 ビット)
から UINT カラー (32 ビット)

おそらく使用するフォーマット コードは、DXGI_FORMAT_R8G8B8A8_UNORM です。

私の考えでは、これは、バイトレベルでチャネルに関する情報を正確な順序で持つ変数があることを意味します: RGBA (これは正しい解釈ですか?-RGBA が必要なときにそれを読んだことがあると確信しているため、尋ねます)実際には次のようなコードが必要です: A#R#G#B#ここでアルファチャンネルが最初に指定されます。

とにかく、私は次のことを選択しました(おそらくもっと良い方法があります):

UINT color = (UINT)WHITE; 

WHITE が定義されている場合:const D3DXCOLOR WHITE(1.0f, 1.0f, 1.0f, 1.0f); このキャストは、D3DXCOLOR の拡張機能で定義されています。

ただし、DXGI_FORMAT_R8G8B8A8_UNORM を UINT カラー変数と共に使用すると、間違った結果が得られます。ルナはこれをエンディアンに帰します。

これは、D3DXCOLOR からのキャストが RGBA 形式の UINT を生成するためですが、Intel x86 はリトル エンディアンを使用するため、バイト レベルでは実際に 'ABGR' が得られるためですか?? この変数が実際に解釈されると、シェーダーは RGBA ではなく ABGR を認識しますか? 上位ビットが小さいアドレスにあることをバイトを解釈するときに知っておくべきではありませんか? そして最後の質問: コードは DXGI_FORMAT_R8G8B8A8_UNORM と指定されているため、これは R が最小のアドレスで、A が最大のアドレスでなければならないということですか? 誤解が多いと思いますので、どうぞご自由に解いてください。

4

1 に答える 1

5

「UINT color = (UINT)WHITE」ステートメントを使用すると、D3DXCOLOR 演算子 DWORD () 変換が呼び出されます。従来の D3DX9Math は Direct3D 9 用に設計されているため、これは BGRA カラーです (DXGI の DXGI_FORMAT_B8G8R8A8_UNORM に相当)。d3dx9math.inl から:

D3DXINLINE
D3DXCOLOR::D3DXCOLOR( DWORD dw )

{
    CONST FLOAT f = 1.0f / 255.0f;
    r = f * (FLOAT) (unsigned char) (dw >> 16);
    g = f * (FLOAT) (unsigned char) (dw >>  8);
    b = f * (FLOAT) (unsigned char) (dw >>  0);
    a = f * (FLOAT) (unsigned char) (dw >> 24);
}

DXGI (v1.0) の元の Direct3D 10 バージョンでは DXGI_FORMAT_B8G8R8A8_UNORM が定義されていないため (DXGI 1.1 で追加されました)、Direct3D 10+ で使用する「既定の」色は RGBA です。

すべての DXGI 形式はリトル エンディアンです。これは、すべての Direct3D 10+ Microsoft プラットフォームに当てはまるためです。Xbox 360 では、Direct3D 9 D3DFORMAT のいくつかの特別なビッグ エンディアン バージョンが導入されましたが、それは実際にここで機能しているものではありません。問題はより基本的なものです。BGRA と RGBA はどちらも有効なオプションですが、Direct3D 9 は BGRA を優先し、Direct3D 10+ は RGBA を優先します。

ややこしいことに、Direct3D 9 D3DFMT の色の命名規則は、DXGI では逆になっています。「D3DFMT_A8R8G8B8」は「DXGI_FORMAT_B8G8R8A8_UNORM」と同じものです。MSDNのこのトピックを参照してください。歴史的に、Windows グラフィックスはこれを「32 ビット ARGB」形式と呼んでいましたが、より自然な言い方は「BGRA」です。

于 2014-07-08T19:46:38.020 に答える