Freigeben über


Ändern der Vertexstromhäufigkeit

Ein DirectX 9.0-Versionstreiber für ein Gerät, das Vertexshader Version 3.0 und höher unterstützt, muss die Vertexstream-Frequenzteilung implementieren. Bei Version 2.0 und früheren Modellen des Vertex-Shaders (einschließlich fester Funktion) wird der Vertex-Shader einmal pro Vertex aufgerufen. Für jeden Aufruf werden die Eingabevertexregister mit eindeutigen Vertexelementen aus den Vertexstreams initialisiert. Mithilfe der Frequenzteilung des Vertexstreams kann jedoch der Vertex-Shader (3.0 und höher) aufgerufen werden, um anwendbare Eingaberegister mit einer weniger häufigen Rate zu initialisieren.

Wenn eine Anwendung die IDirect3DDevice9::SetStreamSourceFreq-Methode aufruft, um die Häufigkeit für einen bestimmten Stream festzulegen, ruft die DirectX 9.0-Runtime wiederum die D3dDrawPrimitives2-Funktion des Treibers mithilfe des D3DDP2OP_SETSTREAMSOURCEFREQ Vorgangscodes auf.

Nachdem der Frequenzteiler des Datenstroms auf z. B. auf 2 festgelegt wurde, muss der Treiber Daten aus dem Stream abrufen und diese Daten an die entsprechenden Eingabevertexregister alle zwei Scheitelpunkte übergeben. Dieser Divisor wirkt sich auf jedes Element im Stream aus.

Der Treiber verwendet diesen Divisor, um den Vertexoffset gemäß der folgenden Formel in den Vertexpuffer zu berechnen:

VertexOffset = VertexIndex / Divider * StreamStride + StreamOffset 

Wenn der Treiber für jeden verwendeten Vertexstream während eines Aufrufs der D3dDrawPrimitives2-Funktion des Treibers mithilfe des D3DDP2OP_DRAWPRIMITIVE Vorgangscodes einen Start-Vertex-Wert empfängt, dividiert der Treiber auch diesen Start-Vertex-Wert durch den Frequenzteiler und berücksichtigt das Ergebnis in der Formel. Dieser Start-Vertex-Wert wird im VStart-Element der D3DHAL_DP2DRAWPRIMITIVE-Struktur bereitgestellt. Die folgende Formel beeinflusst den Start-Vertex-Wert:

VertexOffset = StartVertex / Divider + 
               VertexIndex / Divider * StreamStride + StreamOffset 

Beachten Sie, dass in den vorangehenden Formeln ganzzahlige Divisionen verwendet werden.

Die Anwendung übergibt den D3DSBT_VERTEXSTATE Zustandstyp in einem Aufruf der IDirect3DDevice9::CreateStateBlock-Methode , um den aktuellen Vertexzustand zu erfassen.

Der Treiber ignoriert die Einstellung des Frequenzteilers eines Datenstroms entweder für indizierte Grundtypen oder wenn der Treiber nur ein Vertexshadermodell unterstützt, das älter als Version 3.0 ist (einschließlich der festen Funktion).

Weitere Informationen zu IDirect3DDeviceXxx::SetStreamSourceFreq und IDirect3DDeviceXxx::CreateStateBlock finden Sie in der neuesten DirectX SDK-Dokumentation.