次の方法で共有


定数 float レジスタ (HLSL VS リファレンス)

4 つのコンポーネント浮動小数点定数の頂点シェーダー入力レジスタ。 def - vs または SetVertexShaderConstantF を使用して定数レジスタを設定します。

定数レジスタ ファイルは、頂点シェーダーの観点から読み取り専用です。 1 つの命令は、1 つの定数レジスタにのみアクセスできます。 ただし、その命令の各ソースは、読み取り時にそのベクトルを個別にスウィズルして否定できます。

シェーダー定数の動作が Direct3D 8 と Direct3D 9 の間で変更されました。

  • Direct3D 9 の場合、defx で設定された定数は、シェーダー定数空間に値を割り当てます。 defx で宣言された定数の有効期間は、そのシェーダーの実行のみに限定されます。 逆に、API SetXXXShaderConstantX を使用して設定された定数は、グローバル空間で定数を初期化します。 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

 

頂点シェーダー レジスタ