Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Vertex-Shadereingaberegister für eine vier Komponenten-Gleitkommakonstante. Festlegen eines Konstantenregisters mit def - vs oder SetVertexShaderConstantF.
Die Konstantenregisterdatei ist aus der Perspektive des Vertex-Shaders schreibgeschützt. Jede einzelne Anweisung kann nur auf ein Konstantenregister zugreifen. Jede Quelle in dieser Anweisung kann jedoch unabhängig voneinander swizzle und diesen Vektor ablösen, wie er gelesen wird.
Das Verhalten von Shaderkonstanten wurde zwischen Direct3D 8 und Direct3D 9 geändert.
- Bei Direct3D 9 werden Konstanten, die mit defx festgelegt sind, dem Shaderkonstantenbereich Werte zugewiesen. Die Lebensdauer einer mit Defx deklarierten Konstante ist nur auf die Ausführung dieses Shaders beschränkt. Umgekehrt werden konstanten, die mithilfe der APIs SetXXXShaderConstantX-Initialisierungskonstanten im globalen Raum festgelegt werden. Konstanten im globalen Raum werden erst in den lokalen Bereich kopiert (sichtbar für den Shader), bis SetxxxShaderConstants aufgerufen wird.
- Bei Direct3D 8 werden Konstanten, die mit Defx festgelegt sind, oder die APIs dem Shaderkonstantenbereich Werte zuweisen. Jedes Mal, wenn der Shader ausgeführt wird, werden die Konstanten vom aktuellen Shader unabhängig von der zum Festlegen verwendeten Technik verwendet.
Ein Konstantenregister wird entweder als absolut oder relativ festgelegt:
c[n] ; absolute
c[a0.x + n] ; relative - supported only in version 1_1
Das Konstantenregister kann daher entweder mithilfe eines absoluten Indexes oder mit einem relativen Index aus einem Adressregister gelesen werden. Liest aus out-of-range registers return (0.0, 0.0, 0.0, 0.0, 0.0).
Beispiele
Hier ist ein Beispiel zum Deklarieren von zwei Gleitkommakonstanten innerhalb eines Shaders.
def c40, 0.0f,0.0f,0.0f,0.0f;
Diese Konstanten werden jedes Mal geladen, wenn SetVertexShader- aufgerufen wird.
Hier ist ein Beispiel für die Verwendung der 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 );
}
Wenn Sie Konstantenwerte mit der API festlegen, ist keine Shaderdeklaration erforderlich.
| Vertex-Shaderversionen | 1_1 | 2_0 | 2_sw | 2_x | 3_0 | 3_sw |
|---|---|---|---|---|---|---|
| Konstantenregister | x | x | x | x | x | x |
Verwandte Themen