マルチエレメント テクスチャ
マルチエレメント テクスチャ
従来のテクスチャは、単一要素のテクスチャと見なされる。マルチエレメント テクスチャを使うと、アプリケーションでピクセル シェーダからテクスチャの複数の要素を同時に書き出すことができる。この結果、次のレンダリング パスでは、複数の要素を単一要素のテクスチャとして、つまりピクセル シェーダへの入力として使える。これらの追加要素は中間結果の一時的な格納域と考えることができ、アプリケーションは後のパスでこれを使う。この機能を公開した第 1 世代のハードウェアには、次のような制限があった。
- すべてのマルチエレメント テクスチャ サーフェイスが自動的に割り当てられる。この制限は、このサーフェイスをインターリーブされた複数の RGBA チャンネルを持つ新しいタイプのサーフェイス フォーマットとして扱うことによって解決できる。
- マルチエレメント テクスチャのすべての要素が同じビット深度になる場合がある。この制限は、新しいサーフェイス フォーマットの名前で表される。
- マルチエレメント テクスチャをプライマリや表示可能にすることはできない。つまり、オフスクリーン専用である。この制限は、サーフェイス フォーマットの列挙によって表される。
- ディザリング、アルファ テスト、フォグ、ブレンド、ラスタ処理、マスキングは許可されていない。Z テストおよびステンシル テスト以外に、ピクセル シェーダ後の処理は行われない。
- ミップマップは使えない。ミップ チェーンの作成は失敗する。
- 同じ要素を同時にテクスチャおよびレンダリング ターゲットとして設定することはできない。ただし、同じマルチエレメント テクスチャ サーフェイスの異なる要素を同時にテクスチャおよびレンダリング ターゲットとすることはできる。
- アンチエイリアシングはサポートしていない。
- テクスチャとして使っているマルチエレメント テクスチャ サーフェイスは、フィルタリングできない。この制限は、IDirect3D9::CheckDeviceFormat を使って確認できる。
- マルチエレメント テクスチャ サーフェイスをロックすることはできない。
- 通常のテクスチャのように各マルチエレメント テクスチャ サーフェイスをさまざまなステージに割り当てることによって、複数のマルチエレメント テクスチャ サーフェイスを同時に使える。
- マルチエレメント テクスチャ サーフェイスは、他のテクスチャ フォーマットと同様に、読み込み時のガンマ 2.2 からガンマ 1.0 への変換をサポートしている。
- 実装によっては、出力書き込みマスク (D3DRS_COLORWRITEENABLE) を適用しない場合がある。これを適用できる実装は、個別の色書き込みマスクを持っている。これは、新しい能力ビットで表される。使用可能な個別の色書き込みマスクの数は、デバイスで使用可能な要素の最大数と等しい。
- IDirect3DDevice9::Clear は、レンダリング ターゲットとして設定することによって、マルチエレメント テクスチャのすべての要素をクリアする。
次に、その使い方について説明する。
- アプリケーションは、マルチエレメント テクスチャ フォーマットが使用可能かどうかを調べて、この機能がサポートされているかどうかを確認する。
- アプリケーションは、IDirect3DDevice9::CreateTexture を呼び出してこれらのサーフェイスを作成する。
- アプリケーションは、IDirect3DDevice9::SetRenderTarget 呼び出しを使って、サーフェイスをレンダリング ターゲットとして設定する。ピクセル シェーダは、mov 命令を使ってサーフェイスに出力する。
- IDirect3DDevice9::SetTexture を呼び出し、マルチエレメント テクスチャ サーフェイスを特定のステージに設定する。他のテクスチャと同様、同じサーフェイスを複数のステージに同時に設定できる。
- IDirect3DDevice9::SetSamplerState を呼び出し、サンプラがサンプリングするマルチエレメント テクスチャ サーフェイスの適切な要素番号を D3DSAMP_ELEMENTINDEX に設定する。このステートのデフォルト値が 0 の場合、マルチエレメント テクスチャは機能しない。このステートを不適切な数値に設定すると、不定の動作が生じる。たとえば、マルチエレメント テクスチャの幅が要素 2 つであるときに、4 番目の要素からのサンプリングをサンプラに要求したような場合である。
API の変更
この機能のサポートのために、次のようなアプリケーション プログラミング インターフェイス (API) の変更が提案されている。ここに示すような新しいサーフェイス フォーマットは、フォーマットのインターリーブされた性質を表現している。
新しいインターリーブされたサーフェイス フォーマット:
D3DFMT_MULTI2_ARGB8 = MAKEFOURCC('M','E','T','1'),
取得する要素を示す新しいサンプラ ステート:
D3DSAMP_ELEMENTINDEX
新しいレンダリング ステート:
D3DRS_COLORWRITEENABLE1
D3DRS_COLORWRITEENABLE2
D3DRS_COLORWRITEENABLE3
D3DRS_COLORWRITEENABLE はレンダリング ターゲット (または要素) ゼロに適用される。
新しいハードウェア能力:
D3DPMISCCAPS_INDEPENDENTWRITEMASKS // True if they can support it