HLSL VS 參考 (常數浮點數暫存器)
四個元件浮點常數的頂點著色器輸入暫存器。 使用 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 |
相關主題