Registro de flutuação constante (referência HLSL VS)
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 perspetiva do sombreador de vértice. Qualquer instrução única pode aceder a apenas um registo constante. No entanto, cada fonte nessa instrução pode independentemente girar e negar esse vetor à medida que é lido.
O comportamento das constantes de sombreador foi alterado entre o Direct3D 8 e o Direct3D 9.
- Para o Direct3D 9, as 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 SetXXXShaderConstantX 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. Cada vez que o sombreador é executado, as constantes são usadas pelo sombreador atual, independentemente da técnica usada para defini-los.
Um registo 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. Leituras de registros fora do intervalo retornam (0,0, 0,0, 0,0, 0,0).
Exemplos
Aqui está um exemplo que declara 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 será necessária nenhuma declaração de sombreador.
Versões de sombreador de vértice | 1_1 | 2_0 | 2_sw | 2_x | 3_0 | 3_sw |
---|---|---|---|---|---|---|
Registo constante | x | x | x | x | x | x |
Tópicos relacionados