Регистр с плавающей константой (справочник по 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 |
Связанные темы