Freigeben über


Konstanten float-Register (HLSL VS-Referenz)

Vertex-Shadereingaberegister für eine vier Komponenten-Gleitkommakonstante. Festlegen eines Konstantenregisters mit def - vs oder SetVertexShaderConstantF.

Die Konstantenregisterdatei ist aus der Perspektive des Vertex-Shaders schreibgeschützt. Jede einzelne Anweisung kann nur auf ein Konstantenregister zugreifen. Jede Quelle in dieser Anweisung kann jedoch unabhängig voneinander swizzle und diesen Vektor ablösen, wie er gelesen wird.

Das Verhalten von Shaderkonstanten wurde zwischen Direct3D 8 und Direct3D 9 geändert.

  • Bei Direct3D 9 werden Konstanten, die mit defx festgelegt sind, dem Shaderkonstantenbereich Werte zugewiesen. Die Lebensdauer einer mit Defx deklarierten Konstante ist nur auf die Ausführung dieses Shaders beschränkt. Umgekehrt werden konstanten, die mithilfe der APIs SetXXXShaderConstantX-Initialisierungskonstanten im globalen Raum festgelegt werden. Konstanten im globalen Raum werden erst in den lokalen Bereich kopiert (sichtbar für den Shader), bis SetxxxShaderConstants aufgerufen wird.
  • Bei Direct3D 8 werden Konstanten, die mit Defx festgelegt sind, oder die APIs dem Shaderkonstantenbereich Werte zuweisen. Jedes Mal, wenn der Shader ausgeführt wird, werden die Konstanten vom aktuellen Shader unabhängig von der zum Festlegen verwendeten Technik verwendet.

Ein Konstantenregister wird entweder als absolut oder relativ festgelegt:

c[n]           ; absolute
c[a0.x + n]    ; relative - supported only in version 1_1

Das Konstantenregister kann daher entweder mithilfe eines absoluten Indexes oder mit einem relativen Index aus einem Adressregister gelesen werden. Liest aus out-of-range registers return (0.0, 0.0, 0.0, 0.0, 0.0).

Beispiele

Hier ist ein Beispiel zum Deklarieren von zwei Gleitkommakonstanten innerhalb eines Shaders.

def c40, 0.0f,0.0f,0.0f,0.0f;

Diese Konstanten werden jedes Mal geladen, wenn SetVertexShader- aufgerufen wird.

Hier ist ein Beispiel für die Verwendung der 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 );
    }

Wenn Sie Konstantenwerte mit der API festlegen, ist keine Shaderdeklaration erforderlich.

Vertex-Shaderversionen 1_1 2_0 2_sw 2_x 3_0 3_sw
Konstantenregister x x x x x x

 

Vertex-Shader registriert