浮動小数点型定数レジスタ
4 つの要素の浮動小数点型定数のための頂点シェーダー入力レジスタです。def - vs または SetVertexShaderConstantF を使用して定数レジスタを設定します。
頂点シェーダーから見ると、定数レジスター ファイルは読み取り専用です。1 回の命令でアクセスできる定数レジスターは 1 つだけです。ただし、その命令に含まれる各ソースは読み取ったベクトルを個別に入れ換えたり正負を反転したりできます。
Direct3D 8 と Direct3D 9 では、シェーダー定数の動作は異なります。
- Direct3D 9 の場合、defx を使って設定された定数は、シェーダー定数領域に割り当てます。defx で宣言された定数の有効期間は、そのシェーダーの実行のみに限定されます。反対に、APIs SetXXXShaderConstantX API を使って設定された定数は、定数をグローバル領域で初期化します。グローバル領域の定数は、SetxxxShaderConstants が呼び出されるまで、シェーダーから見えるローカル領域にコピーされません。
- Direct3D 8 の場合、defx または API を使って設定された定数は、どちらもシェーダー定数領域に割り当てます。シェーダーが実行されるたびに、定数の設定に使われた手法にかかわらず、現在のシェーダーが定数を使用します。
定数レジスタは、絶対位置または相対位置で指定できます。
c[n] ; absolute c[a0.x + n] ; relative - supported only in version 1_1
したがって、定数レジスタは絶対インデックスを使って読み取ることも、アドレス レジスタからの相対インデックス指定によって読み取ることもできます。レジスターの範囲外から読み取りを行うと、(0.0, 0.0, 0.0, 0.0) が返ります。
例
次の例では、シェーダー内で 2 つの浮動小数点型定数を宣言しています。
def c40, 0.0f,0.0f,0.0f,0.0f;
これらの定数は、SetVertexShader を呼び出すたびに読み込まれます。
次の例では、API を使用しています。
// Set up the vertex shader constants. { D3DXMATRIXA16 mat; D3DXMatrixMultiply( &mat, &m_matView, &m_matProj ); D3DXMatrixTranspose( &mat, &mat ); D3DXVECTOR4 vA( sinf(m_fTime)*15.0f, 0.0f, 0.5f, 1.0f ); D3DXVECTOR4 vD( D3DX_PI, 1.0f/(2.0f*D3DX_PI), 2.0f*D3DX_PI, 0.05f ); // Taylor series coefficients for sin and cos. D3DXVECTOR4 vSin( 1.0f, -1.0f/6.0f, 1.0f/120.0f, -1.0f/5040.0f ); D3DXVECTOR4 vCos( 1.0f, -1.0f/2.0f, 1.0f/ 24.0f, -1.0f/ 720.0f ); m_pd3dDevice->SetVertexShaderConstantF( 0, (float*)&mat, 4 ); m_pd3dDevice->SetVertexShaderConstantF( 4, (float*)&vA, 1 ); m_pd3dDevice->SetVertexShaderConstantF( 7, (float*)&vD, 1 ); m_pd3dDevice->SetVertexShaderConstantF( 10, (float*)&vSin, 1 ); m_pd3dDevice->SetVertexShaderConstantF( 11, (float*)&vCos, 1 ); }
定数値を API で設定する場合は、シェーダー宣言は不要です。
頂点シェーダーのバージョン | 1_1 | 2_0 | 2_sw | 2_x | 3_0 | 3_sw |
---|---|---|---|---|---|---|
定数レジスタ | x | x | x | x | x | x |