4개의 구성 요소 부동 소수점 상수에 대한 꼭짓점 셰이더 입력 레지스터입니다. def와 또는 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 |
관련 항목