共用方式為


HLSL VS 參考 (常數浮點數暫存器)

四個元件浮點常數的頂點著色器輸入暫存器。 使用 def - vsSetVertexShaderConstantF設定常數暫存器。

常數暫存器檔案從頂點著色器的觀點來看是唯讀的。 任何單一指令只能存取一個常數暫存器。 不過,該指令中的每個來源在讀取時可能會獨立擷取並否定該向量。

著色器常數的行為在 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) 。

範例

以下是在著色器內宣告兩個浮點常數的範例。

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

 

頂點著色器暫存器