Поделиться через


Константный с плавающей запятой (справочник по HLSL VS)

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

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

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

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

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

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

Поэтому регистр констант можно считывать либо с помощью абсолютного индекса, либо с относительным индексом из регистра адресов. Считывает данные из исходящих регистров (0.0, 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

 

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