Регистр с плавающей константой (справочник по VS HLSL)

Входной регистр шейдера вершин для константы с плавающей запятой из четырех компонентов. Задайте регистр константы с помощью def - vs или SetVertexShaderConstantF.

Файл регистра констант доступен только для чтения с точки зрения вершинного шейдера. Любая отдельная инструкция может получить доступ только к одному регистру констант. Однако каждый источник в этой инструкции может независимо отключается и отрицать этот вектор по мере считывания.

Поведение констант шейдера изменилось между Direct3D 8 и Direct3D 9.

  • Для Direct3D 9 константы, заданные с defx, присваивают значения пространству констант шейдера. Время существования константы, объявленной с defx, ограничивается только выполнением этого шейдера. И наоборот, константы, заданные с помощью API SetXXXShaderConstantX, инициализируют константы в глобальном пространстве. Константы в глобальном пространстве не копируются в локальное пространство (видимое для шейдера), пока не будет вызван setxxxShaderConstants.
  • Для Direct3D 8 константы, заданные с defx или API, присваивают значения пространству констант шейдера. При каждом выполнении шейдера константы используются текущим шейдером независимо от метода их задания.

Регистр констант обозначается как абсолютный или относительный:

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

Таким образом, регистр константы можно считать либо с помощью абсолютного индекса, либо с относительным индексом из регистра адресов. Операции чтения из регистров вне диапазона возвращаются (0,0, 0,0, 0,0, 0,0).

Примеры

Ниже приведен пример объявления двух констант с плавающей запятой в шейдере.

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

Эти константы загружаются при каждом вызове SetVertexShader .

Ниже приведен пример использования 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 );
    }

Если вы задаете значения констант с помощью API, объявление шейдера не требуется.

Версии вершинного шейдера 1_1 2_0 2_sw 2_x 3_0 3_sw
Константный регистр x x x x x x

 

Регистры вершинного шейдера