texm3x3spec - ps
3x3 行列乗算を実行し、その結果を使用してテクスチャー ルックアップを実行します。この命令は、スペキュラー反射と環境マッピングに利用できます。texm3x3spec は、2 つの texm3x3pad - ps 命令と組み合わせて使用する必要があります。
構文
texm3x3spec dst, src0, src1 |
---|
この場合
- dst はデスティネーション レジスタです。
- src0 および src1 はソース レジスタです。
解説
ピクセル シェーダーのバージョン | 1_1 | 1_2 | 1_3 | 1_4 | 2_0 | 2_x | 2_sw | 3_0 | 3_sw |
---|---|---|---|---|---|---|---|---|---|
texm3x3spec | x | x | x |
この命令では 3x3 行列の最後の行の乗算を実行し、結果のベクトルを法線ベクトルに使用して視線ベクトルを反射した後、反射されたベクトルを使用してテクスチャー ルックアップを実行します。シェーダーは定数レジスターから視線ベクトルを読み取ります。一般的に 3x3 行列乗算は、レンダリング対象のサーフェスに対する正しい接線空間の方向に法線ベクトルを定義する際に役立ちます。
3x3 行列は、3 番目のテクスチャー ステージと前 2 つのテクスチャー ステージのテクスチャー座標で構成されます。生成された反射後のベクトル (u,v,w) を使用して、最後のテクスチャー ステージでテクスチャーをサンプリングします。前 2 つのテクスチャー ステージに割り当てられているテクスチャーはすべて無視されます。
この命令は 2 つの texm3x3pad 命令と組み合わせて使用する必要があります。テクスチャー レジスタでは、次の手順に従う必要があります。
tex t(n) // Define tn as a standard 3-vector (tn must
// be defined in some way before it is used)
texm3x3pad t(m), t(n) // where m > n
// Perform first row of matrix multiply
texm3x3pad t(m+1), t(n) // Perform second row of matrix multiply
texm3x3spec t(m+2), t(n), c0 // Perform third row of matrix multiply
// Then do a texture lookup on the texture
// associated with texture stage m+2
最初の texm3x3pad 命令で 1 行目の乗算を実行し、u' を求めます。
u' = TextureCoordinates(stage m)UVW * t(n)RGB
2 番目の texm3x3pad 命令で 2 行目の乗算を実行し、v' を求めます。
v' = TextureCoordinates(stage m+1)UVW * t(n)RGB
texm3x3spec 命令で 3 行目の乗算を実行し、w' を求めます。
w' = TextureCoordinates(stage m+2)UVW * t(n)RGB
次に、texm3x3spec 命令で反射計算を実行します。
(u'', v'', w'') = 2*[(N*E)/(N*N)]*N - E
// where the normal N is given by
// N = (u', v', w')
// and the eye-ray vector E is given by the constant register
// E = c# (Any constant register--c0, c1, c2, etc.--can be used)
最後に texm3x3spec 命令で、t(m+2) において (u'',v'',w'') でサンプリングを行い、結果を t(m+2) に格納します。
t(m+2)RGBA = TextureSample(stage m+2)RGBA using (u'', v'', w'') as coordinates
例
次に示すシェーダーの例では、テクスチャー マップとテクスチャー ステージが指定されています。
ps_1_1
tex t0 // Bind texture in stage 0 to register t0 (tn must
// be defined in some way before it is used)
texm3x3pad t1, t0 // First row of matrix multiply
texm3x3pad t2, t0 // Second row of matrix multiply
texm3x3spec t3, t0, c# // Third row of matrix multiply to get a 3-vector
// Reflect 3-vector by the eye-ray vector in c#
// Use reflected vector to lookup texture in
// stage 3
mov r0, t3 // Output the result
この例では、次のようにテクスチャー ステージを設定する必要があります。
- ステージ 0 には、法線データを含むテクスチャー マップを割り当てます。これは通常、バンプ マップと呼ばれます。このデータは各テクセルに対する (XYZ) 法線です。ステージ n のテクスチャー座標により、この法線マップのサンプリング先が定義されます。
- テクスチャー座標セット m を、3x3 行列の行 1 に対して割り当てます。ステージ m に割り当てられているテクスチャーはすべて無視されます。
- テクスチャー座標セット m+1 を、3x3 行列の行 2 に対して割り当てます。ステージ m+1 に割り当てられているテクスチャーはすべて無視されます。
- テクスチャー座標セット m+2 を、3x3 行列の行 3 に対して割り当てます。ステージ m+2 を、ボリューム テクスチャー マップまたはキューブ テクスチャー マップに割り当てます。テクスチャーによりカラー データ (RGBA) が与えられます。
- 視線ベクトル E は、定数レジスター E = c# により指定されます。