ps_1_1__ps_1_2__ps_1_3__ps_1_4 レジスタ
ピクセル シェーダーではレジスタを利用して、頂点データの取得、ピクセル データの出力、計算中の一時的な結果の保持、テクスチャー サンプリング ステージの識別を行います。レジスタにはさまざまな種類があり、それぞれが固有の機能を持っています。ここでは、ピクセル シェーダー バージョン 1_X 命令のリファレンス情報について説明します。
レジスタには、ピクセル シェーダーで使用されるデータが格納されます。レジスタの詳細については、以下のトピックで説明します。
- 「レジスタのタイプ」では、利用できる 4 種類のレジスタと、その目的について説明します。
- 「読み取りポート制限」では、1 つの命令で複数のレジスタを使用する場合の制限について詳しく説明します。
- 「読み取り専用、読み取り/書き込み」では、読み取り、書き込み、または読み書きに使用できるレジスタについて説明します。
- 「範囲」では、コンポーネント データの範囲について詳しく説明します。
レジスタのタイプ
バージョン | |||||
---|---|---|---|---|---|
名前 | 型 | 1_1 | 1_2 | 1_3 | 1_4 |
c# | 定数レジスタ | 8 | 8 | 8 | 8 |
r# | テンポラリ レジスタ | 2 | 2 | 2 | 6 |
t# | テクスチャー レジスタ | 4 | 4 | 4 | 6 |
v# | カラー レジスタ | 2 | 2 | 2 | フェーズ 2 で 2 |
定数レジスタには、定数データが格納されます。データを定数レジスタに読み込むには、SetPixelShaderConstantF を使用します。データを定義するには、def - ps を使用します。定数レジスタはテクスチャー アドレッシング命令では使用できません。ただし texm3x3spec - ps 命令だけは例外です。この命令では定数レジスタを使用して視線ベクトルを指定します。
一時レジスタを使用して中間結果を格納します。r0 は、ピクセル シェーダー出力としても機能します。シェーダーの末尾にある r0 の値は、シェーダーのピクセル カラーです。
直前の命令で書き込まれなかったテンポラリ レジスタから読み取ろうとするシェーダーでは、シェーダー検証で実行する CreatePixelShader が失敗します。検証が有効であることを前提としている D3DXAssembleShader も同様に失敗します (D3DXSHADER_SKIPVALIDATION は使用しないでください)。
テクスチャー レジスタ
ピクセル シェーダー バージョン 1_1 ~ 1_3 では、テクスチャー レジスタにテクスチャー データまたはテクスチャー座標が格納されます。テクスチャーをサンプリングする際に、テクスチャー データがテクスチャー レジスタにロードされます。テクスチャー サンプリングでは、テクスチャー ステージのステート属性を考慮する際に、テクスチャー座標を利用して指定された (u,v,w,q) 座標におけるカラー値をルックアップ、つまりサンプリングします。テクスチャー座標データは頂点テクスチャー座標データによって補間され、特定のテクスチャー ステージに関連付けられます。テクスチャー ステージ番号は、デフォルトでテクスチャー座標の宣言順序と 1 対 1 で対応しています。デフォルトで、頂点フォーマットで最初に定義されるテクスチャー座標のセットが、テクスチャー ステージ 0 に関連付けられます。
これらのピクセル シェーダー バージョンの場合、テクスチャー レジスタを算術命令で使用するとテンポラリ レジスタのように動作します。
ピクセル シェーダー バージョン 1_4 の場合、テクスチャー レジスタ (t#) には読み取り専用のテクスチャー座標データが格納されます。つまり、テクスチャー座標セットとテクスチャー ステージ番号の間に関連性はありません。(テクスチャーのサンプリングを行う) テクスチャー ステージの番号は、デスティネーション レジスタ番号 (r0 ~ r5) により決定されます。texld 命令では、テクスチャー座標セットはソース レジスタ (t0 ~ t5) によって決定されるため、テクスチャー座標セットを任意のテクスチャー ステージにマッピングすることができます。さらに、texld のソース レジスタ (テクスチャー座標を指定します) もテンポラリ レジスタ (r#) にすることができます。この場合、このテンポラリ レジスタの内容がテクスチャー座標として使用されます。
カラー レジスタには、各ピクセルのカラー値が格納されます。この値は、頂点データのディフューズ カラーとスペキュラ カラーをピクセル単位で補間することにより取得されます。ピクセル シェーダー バージョン 1_4 のシェーダーでは、カラー レジスタは第 2 段階でのみ使用できます。
シェード モードが D3DSHADE_FLAT に設定されている場合、頂点カラー (ディフューズとスペキュラ) の補間はどちらも無効になります。シェード モードに関係なく、ピクセル フォグが有効であれば、フォグはパイプラインで補間されます。フォグはパイプライン内でピクセル シェーダーの後に適用されることに注意してください。
一般的に、頂点ディフューズ カラー データは v0 レジスタにロードします。また一般的に、頂点スペキュラ カラー データは v1 レジスタにロードします。
入力されたカラー データの値は 0 ~ 1 の範囲にクランプ (飽和) されます。これは、ピクセル シェーダーのカラー レジスタの有効な入力範囲が 0 ~ 1 であるためです。
ピクセル シェーダーのカラー レジスタに対するアクセスは読み取り専用です。これらのレジスタの内容は補間された値ですが、この補間はテクスチャー座標よりもはるかに低い精度で実行される場合があります。
読み取りポート制限
読み取りポート制限により、1 つの命令でソース レジスタとして使用できる、各タイプのレジスタの数が指定されます。
バージョン | |||||
---|---|---|---|---|---|
名前 | 型 | 1_1 | 1_2 | 1_3 | 1_4 |
c# | 定数レジスタ | 2 | 2 | 2 | 2 |
r# | テンポラリ レジスタ | 2 | 2 | 2 | 3 |
t# | テクスチャー レジスタ | 2 | 3 | 3 | 1 |
v# | カラー レジスタ | 2 | 2 | 2 | フェーズ 2 で 2 |
たとえば、ほぼすべてのバージョンでカラー レジスタの読み取りポート制限は 2 になっています。つまり、1 つの命令で最大 2 つの異なるカラー レジスタ (v0 と v1 など) をソース レジスタとして使用できます。次に示す例では、同じ命令で 2 つのカラー レジスタが使用されています。
mad r0, v1, c2, v0
読み取り専用、読み取り/書き込み
次の表に示すように、レジスタのタイプは読み取り専用 (RO) と読み取り/書き込み (RW) に分類されます。読み取り専用レジスタは、命令内でソース レジスタとしてのみ使用できます。デスティネーション レジスタとしては使用できません。
バージョン | |||||
---|---|---|---|---|---|
名前 | 型 | 1_1 | 1_2 | 1_3 | 1_4 |
c# | 定数レジスタ | RO | RO | RO | RO |
r# | テンポラリ レジスタ | RW | RW | RW | RW |
t# | テクスチャー レジスタ | RW | RW | RW | 下記の注意を参照してください。 |
v# | カラー レジスタ | RO | RO | RO | RO |
RW 機能を持つレジスタは、中間結果を格納するために使用できます。これには、いくつかのシェーダー バージョンにおけるテンポラリ レジスタとテクスチャー レジスタが該当します。
注
- ピクセル シェーダー バージョン 1_4 の場合、テクスチャー アドレッシング命令におけるテクスチャー レジスタは読み取り専用です。算術命令では、テクスチャー レジスタは読み取りも書き込みも不可能です。また、テクスチャー レジスタはテクスチャー座標レジスタになったため、アクセスが読み取り専用だとしても以前よりも機能が低下しているわけではありません。
範囲
範囲とは、レジスタ データの最大値と最小値です。範囲はレジスタのタイプによって異なります。レジスタによっては、GetDeviceCaps を使用してデバイス キャップから範囲をクエリすることができます。
名前 | 型 | 範囲 | バージョン |
---|---|---|---|
c# | 定数レジスタ | -1 ~ +1 | すべてのバージョン |
r# | テンポラリ レジスタ | - PixelShader1xMaxValue ~ + PixelShader1xMaxValue | すべてのバージョン |
t# | テクスチャー レジスタ | - MaxTextureRepeat ~ + MaxTextureRepeat | すべてのバージョン |
v# | カラー レジスタ | 0 ~ 1 | すべてのバージョン |
初期のピクセル シェーダー ハードウェアでは、固定小数点数を使用してレジスタ内のデータを表します。このため、数値の小数部の精度が最大で約 8 ビットに制限されます。シェーダーを設計する際に、この点について注意してください。
ピクセル シェーダー バージョン 1_1 ~ 1_3 の場合、MaxTextureRepeat は 1 以上にする必要があります。バージョン 1_4 の場合には、MaxTextureRepeat を 8 以上にする必要があります。
PixelShader1xMaxValue の詳細については、「D3DCAPS9」を参照してください。