Konstanter Float-Register (HLSL VS-Referenz)

Vertexshadereingaberegister für eine Gleitkommakonstante mit vier Komponenten. Legen Sie ein Konstantenregister entweder mit def - vs oder SetVertexShaderConstantF fest.

Die Konstantenregisterdatei ist aus Sicht des Vertexshaders schreibgeschützt. Jede einzelne Anweisung kann nur auf ein Konstantenregister zugreifen. Jede Quelle in dieser Anweisung kann jedoch unabhängig voneinander schwammen und diesen Vektor beim Lesen negieren.

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

  • Für Direct3D 9 weisen Konstanten, die mit defx festgelegt sind, dem Shaderkonstantenbereich Werte zu. Die Lebensdauer einer Konstanten, die mit defx deklariert wurde, ist nur auf die Ausführung dieses Shaders beschränkt. Umgekehrt werden konstanten, die mithilfe der APIs SetXXXShaderConstantX festgelegt werden, Konstanten im globalen Raum initialisiert. Konstanten im globalen Raum werden erst in den lokalen Bereich (sichtbar für den Shader) kopiert, bis SetxxxShaderConstants aufgerufen wird.
  • Für Direct3D 8 weisen Konstanten, die mit defx oder den APIs festgelegt sind, dem Shaderkonstantenbereich Werte zu. Jedes Mal, wenn der Shader ausgeführt wird, werden die Konstanten vom aktuellen Shader verwendet, unabhängig von der Technik, mit der sie festgelegt werden.

Ein konstantes Register wird entweder als absolut oder relativ bezeichnet:

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. Lesevorgänge aus Außerbereichsregistern geben zurück (0.0, 0.0, 0.0, 0.0).

Beispiele

Hier sehen Sie ein Beispiel zum Deklarieren von zwei Gleitkommakonstanten in einem Shader.

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

Diese Konstanten werden bei jedem Aufruf von SetVertexShader geladen.

Hier sehen Sie 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 konstante Werte mit der API festlegen, ist keine Shaderdeklaration erforderlich.

Vertexshaderversionen 1_1 2_0 2_sw 2_x 3_0 3_sw
Konstantenregister x x x x x x

 

Vertex-Shaderregister