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