Share via


Registro float constante (referência vs HLSL)

Registro de entrada do sombreador de vértice para uma constante de ponto flutuante de quatro componentes. Defina um registro constante com def - vs ou SetVertexShaderConstantF.

O arquivo de registro constante é somente leitura da perspectiva do sombreador de vértice. Qualquer instrução única pode acessar apenas um registro constante. No entanto, cada fonte nessa instrução pode girar e negar independentemente esse vetor conforme ele é lido.

O comportamento das constantes de sombreador mudou entre o Direct3D 8 e o Direct3D 9.

  • Para Direct3D 9, constantes definidas com defx atribuem valores ao espaço constante do sombreador. O tempo de vida de uma constante declarada com defx é limitado apenas à execução desse sombreador. Por outro lado, as constantes definidas usando as APIs SetXXShaderConstantX inicializam constantes no espaço global. As constantes no espaço global não são copiadas para o espaço local (visível para o sombreador) até que SetxxxShaderConstants seja chamado.
  • Para o Direct3D 8, as constantes definidas com defx ou as APIs atribuem valores ao espaço constante do sombreador. Sempre que o sombreador é executado, as constantes são usadas pelo sombreador atual, independentemente da técnica usada para defini-las.

Um registro constante é designado como absoluto ou relativo:

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

O registro constante pode ser lido, portanto, usando um índice absoluto ou com um índice relativo de um registro de endereço. As leituras de registros fora do intervalo retornam (0.0, 0.0, 0.0, 0.0).

Exemplos

Aqui está um exemplo declarando duas constantes de ponto flutuante dentro de um sombreador.

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

Essas constantes são carregadas sempre que SetVertexShader é chamado.

Aqui está um exemplo usando a 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 );
    }

Se você estiver definindo valores constantes com a API, não haverá nenhuma declaração de sombreador necessária.

Versões do sombreador de vértice 1_1 2_0 2_sw 2_x 3_0 3_sw
Registro constante x x x x x x

 

Registros de sombreador de vértice