命令 - ps_2_x
命令 - ps_2_x
ここでは、ピクセル シェーダ バージョン 2_x 命令のリファレンス情報を記述する。
次の表に示すように、ピクセル シェーダ命令にはいくつかの種類がある。右側の列の意味は次のとおりである。
- 命令スロット - 各命令が使う命令スロットの数。
- セットアップ - ピクセル シェーダには、バージョン命令を 1 つ指定する必要がある。 また、その命令は最初の命令でなければならない。
- 算術 - これらの命令は、シェーダ内での算術演算を行う。
- マクロ演算子 - これらの命令は、算術命令を結合して高レベルの機能を実現する。マクロ演算子の使用はオプションである。基本となる実装に最適化の機会を与えるので、マクロ演算子、特に行列乗算命令 (m3x2、m3x3、m3x4、m4x3、m4x4) の使用を推奨する。
- テクスチャ - これらの命令は、テクスチャ データをロードおよびサンプリングするためと、テクスチャ座標を修飾するために使う。
- フロー制御 - これらの命令は命令の実行に対して静的および動的なフロー制御を提供する。
- 新規 - これらの命令はこのバージョンの新機能である。
命令セット
名前 | 説明 | 命令スロット | セットアップ | 算術 | マクロ演算子 | テクスチャ | フロー制御 | 新規 |
---|---|---|---|---|---|---|---|---|
abs | 絶対値 | 1 | x | |||||
add | 2 つのベクトルの加算 | 1 | x | |||||
break | loop...endloop または rep...endrep ブロックを終了する | 1 | x | x | ||||
break_comp | 比較の条件に基づいて、loop...endloop または rep...endrep ブロックを終了する | 3 | x | x | ||||
break pred | プレディケーションに基づいて、loop...endloop または rep...endrep ブロックを終了する | 3 | x | x | ||||
call | サブルーチンを呼び出す | 2 | x | x | ||||
callnz | ブール型レジスタがゼロでない場合にサブルーチンを呼び出す | 3 | x | x | ||||
callnz pred | プレディケーションがゼロでない場合にサブルーチンを呼び出す | 3 | x | x | ||||
cmp | 入力を 0 と比較する | 1 | x | |||||
crs | 外積 | 2 | x | |||||
dcl | 頂点要素のタイプを入力頂点レジスタにマッピングする | 0 | x | |||||
dcl_textureType | サンプラのテクスチャのディメンジョンを宣言する | 0 | x | |||||
def | 定数の定義 | 0 | x | |||||
dp2add | 2D の内積および加算 | 1 | x | |||||
dp3 | 3D の内積 | 1 | x | |||||
dp4 | 4D の内積 | 1 | x | |||||
dsx | x 方向の変化割合 | 2 | x | x | ||||
dsy | y 方向の変化割合 | 2 | x | x | ||||
else | else ブロックの開始 | 1 | x | x | ||||
endif | if...else ブロックの終了 | 1 | x | x | ||||
endrep | repeat ブロックの終了 | 2 | x | x | ||||
exp | 完全精度の 2x | 1 | x | x | ||||
frc | 小数部 | 1 | x | |||||
if | if ブロックの開始 | 3 | x | x | ||||
if comp | 比較に基づいて、if ブロックを開始する | 3 | x | x | ||||
if pred | プレディケーションに基づいて、if ブロックを開始する | 3 | x | x | ||||
label | ラベルを付ける | 0 | x | x | ||||
log | 完全精度の log2(x) | 1 | x | |||||
lrp | 線形補間 | 2 | x | |||||
m3x2 | 3x2 行列乗算 | 2 | x | |||||
m3x3 | 3x3 行列乗算 | 3 | x | |||||
m3x4 | 3x4 行列乗算 | 4 | x | |||||
m4x3 | 4x3 行列乗算 | 3 | x | |||||
m4x4 | 4x4 行列乗算 | 4 | x | |||||
mad | 積和 | 1 | x | |||||
max | 最大値 | 1 | x | |||||
min | 最小値 | 1 | x | |||||
mov | 移動 | 1 | x | |||||
mul | 乗算 | 1 | x | |||||
nop | 空命令 (何の演算も実行しない) | 1 | x | |||||
nrm | 正規化 | 3 | x | |||||
pow | 2x | 3 | x | |||||
ps | バージョン | 0 | x | |||||
rcp | 逆数 | 1 | x | |||||
rep | 繰り返す | 3 | x | x | ||||
ret | サブルーチンの終了 | 1 | x | x | ||||
rsq | 逆数平方根 | 1 | x | |||||
setp | プレディケーション レジスタを設定する | 1 | x | x | ||||
sincos | 正弦と余弦 | 8 | x | |||||
sub | 減算 | 1 | x | |||||
texkill | ピクセル レンダリングを終了させる | 2(tex) | x | |||||
texld | テクスチャのサンプリング | 1 + 3CUBE | x | |||||
texldb | w 成分の詳細レベル (LOD) のバイアスを使ったテクスチャ サンプリング | 6(tex) | x | |||||
texldd | ユーザー指定のグラデーションを使ったテクスチャ サンプリング | 3 | x | x | ||||
texldp | w 成分による射影除算を使ったテクスチャ サンプリング | 3 + 1CUBE | x |
ここで
- tex - 1 テクスチャ命令スロットである。ただし、D3DPS20CAPS_NOTEXINSTRUCTIONLIMIT が設定されている場合、この命令は、命令 (非テクスチャ) カウントでカウントされる。
- 1 + 3CUBE は、テクスチャがキューブ マップの場合に 1 + 3 であることを意味する。
- 3 + 1CUBE は、テクスチャがキューブ マップの場合に 3 + 1 であることを意味する。
命令カウントとネストの深さ
シェーダには、最大命令カウントと、静的および動的なフロー制御命令のネストの深さに関する制限がある。
全命令カウント
総命令スロット数 :最大 512 個
実行される命令の最大数は、D3DCAPS9 の MaxPShaderInstructionsExecuted 能力に指定されている数である。
- ps_2_0 をサポートするハードウェアでは、少なくとも 96 (フロー制御能力をサポートしている場合は 96 以上) でなければならない。
この数には、#define D3DINFINITEINSTRUCTIONS を設定できる。これは、実行される命令の実際の数が無制限であることを示す。
実行される命令の総数は、デバイス ドライバ D3DRS_MAXPIXELSHADERINST に制限されなければならない。このレンダリング ステートで有効な値は、2 の累乗の数である。それ以外の整数を設定すると、次の最も近い 2 の累乗の数と見なされる。このレンダリング ステートにはデフォルトで、D3DINFINITEINSTRUCTIONS が設定される。
動的フロー制御のネストの深さ
D3DCAPS9.D3DPSHADERCAPS2_0.DynamicFlowControlDepth は、動的フロー制御命令 if、break、および break_comp のネストの深さを表す。この値は、if_comp ブロックのネストの深さと等しい。この能力の値の範囲は 0 ~ 24 である。この能力が 0 の場合、デバイスは動的フロー制御命令をサポートしない。
静的フロー制御のネストの深さ
D3DCAPS9.D3DPSHADERCAPS2_0.StaticFlowControlDepth は、静的フロー制御命令loop/rep および call/callnz のネストの深さを表す。この能力の値の範囲は、1 ~ 4 である。loop/rep は同じネストの深さに対してカウントし、call/callnz は同じネストの深さに対してカウントする。この能力が 0 の場合、デバイスは静的フロー制御命令をサポートしない。