Condividi tramite


Registro float costante (riferimento vs HLSL)

Registro di input del vertex shader per una costante a virgola mobile a quattro componenti. Impostare un registro costante con def - vs o SetVertexShaderConstantF.

Il file di registro costante è di sola lettura dal punto di vista del vertex shader. Qualsiasi singola istruzione può accedere a un solo registro costante. Tuttavia, ogni origine in tale istruzione può scorrere in modo indipendente e negare tale vettore durante la lettura.

Il comportamento delle costanti shader è cambiato tra Direct3D 8 e Direct3D 9.

  • Per Direct3D 9, le costanti impostate con defx assegnano valori allo spazio costante dello shader. La durata di una costante dichiarata con defx è limitata solo all'esecuzione di tale shader. Al contrario, le costanti impostate usando le API SetXXXShaderConstantX inizializzano le costanti nello spazio globale. Le costanti nello spazio globale non vengono copiate nello spazio locale (visibile allo shader) fino a quando non viene chiamato SetxxxShaderConstants.
  • Per Direct3D 8, le costanti impostate con defx o le API assegnano entrambi i valori allo spazio costante dello shader. Ogni volta che viene eseguito lo shader, le costanti vengono usate dallo shader corrente indipendentemente dalla tecnica usata per impostarle.

Un registro costante viene designato come assoluto o relativo:

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

Il registro costante può quindi essere letto utilizzando un indice assoluto o con un indice relativo da un registro indirizzi. Legge dalla restituzione dei registri non compreso nell'intervallo (0.0, 0.0, 0.0, 0.0).

Esempio

Di seguito è riportato un esempio che dichiara due costanti a virgola mobile all'interno di uno shader.

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

Queste costanti vengono caricate ogni volta che viene chiamato SetVertexShader .

Di seguito è riportato un esempio di uso dell'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 si impostano valori costanti con l'API, non è necessaria alcuna dichiarazione di shader.

Versioni del vertex shader 1_1 2_0 2_sw 2_x 3_0 3_sw
Registro costante x x x x x x

 

Registri vertex shader