Microsoft DirectX 8.0 (Visual Basic) |
ステージ 0 のテクスチャ処理に使用されるアドレスは、最初のテクスチャ座標レジスタ (t0) を介して提示されるバンプ マップ アドレスとなる。処理は、次のピクセル シェーダ コードに示すように、バンプ データの単純な参照である。
tex t0
ステージ 1 のテクスチャ処理はより複雑である。この場合には、2 × 2 行列がロードされるようにテクスチャ ステージ ステートを設定する必要がある。ここで、視点と光源の間の変更をシミュレートするためにロードできる 2 × 2 行列があることに注目する。これにより、シーン内で視点が移動する際、バンプ マップおよび環境マップを再利用することができる。このため、環境マップへのアドレスは、2 番目のテクスチャ座標である t1 を介して提示されたベース アドレスが、視点調整およびローカル バンプ値によって乗算されたものとなる。より正確には、環境マップへの u 座標は u = t1.r + mat00 * t0.r + mat01 * t0.g であり、環境マップへの v 座標は v = t1.g + mat10 * t0.r + mat11 * t0.g となる。t0.r および t0.g レジスタ成分の値は、実際には du および dv の値であり、ステージ 0 でのバンプ データ参照を表し、レジスタ t0 に格納される。
注 u および v アドレスの計算には、実際のピクセル シェーダ コード内に 2 つのスロットを要する場合がある。これは、ほとんどのハードウェアが、u のロジックを再利用し、その後 v アドレス計算を再利用するためである。現在のハードウェアでは、アドレスをパラレルで計算することはできない。
次の例では、このことをピクセル シェーダ コード内で実行する方法を示している。
ps.1.0 // DirectX8 バージョン。 tex t0 // テクスチャ (バンプ データ) を宣言する。 texbem t1, t0 // 環境マップを宣言し、t0 からデータを取得する。 mov r0, v0 // ディフューズ色のオレンジ色が // 各ピクセルのレジスタ v0 を介してピクセル シェーダに // 渡されているという仮定に注意すること。 add r0, r0, t1 // スペキュラ環境データを追加する。
これは非常に単純な例であり、多くの場合に適用できるものではない。通常は、バンプ環境マッピングの実行前にベース テクスチャがオブジェクトに適用される。たとえば、テクスチャ データを適用するためのベースとして、白い球体などを送る。これは、サーフェス上のある部分では明るく、ある部分ではやや暗いディフューズ ライトである。この場合、ステージからバンプ環境マッピング処理を外し、ベース テクスチャをディフューズ ライトによって乗算する。次の例では、このことをピクセル シェーダ コード内で実行する方法を示している。
ps.1.0 // DirectX8 バージョン tex t0 // ベース テクスチャを宣言する。大理石、木材、その他のサーフェス マテリアルなど、 // 任意のものを宣言できる。 tex t1 // テクスチャ (バンプ データ) を宣言する。 texbem t2, t1 // 環境マップを宣言する。 mul r0, v0, t0 // ディフィーズ ライトでベース テクスチャを乗算する。 add r0, r0, t2 // スペキュラ環境データを追加する。
従来のテクスチャ マッピング (1 ステージ) を使用し、スペキュラを補間し、ピクセル シェーダ仮想マシンのレジスタ v1 を介して利用できるようにすることが推奨される。その他の複雑なピクセル シェーダは、定数レジスタ (c0〜c7) に格納されている一連の固定定数を使って構築できる。また、テクスチャ レジスタは多くの場合テクスチャ ステージと共に使用されるが、ピクセル演算論理単位 (ALU) への読み書きである。このためピクセル シェーダは、テクスチャ レジスタをテンポラリ レジスタとして使用できる。また、r0 および r1 は ALU への読み書きであるが、r0 に格納される結果は、深度およびステンシル ロジックに出力できる唯一の結果である。事実、結果をストリームに渡す唯一の方法は、r0 レジスタを使用することである。