Texturkoordinatentransformationen (Direct3D 9)
Direct3D-Geräte können die Texturkoordinaten für Scheitelpunkte transformieren, indem sie eine 4x4-Matrix anwenden. Das System wendet Transformationen auf Texturkoordinaten auf die gleiche Weise an wie die Geometrie. Jede Transformation (Skalierung, Drehung, Übersetzung, Projektion, Scherung oder eine beliebige Kombination davon) kann mit einer 4x4-Matrix erfolgen.
Hinweis
Direct3D ändert keine transformierten und beleuchteten Scheitelpunkte. Daher kann eine Anwendung, die transformierte und beleuchtete Sctices verwendet, Direct3D nicht verwenden, um die Texturkoordinaten der Scheitelpunkte zu transformieren.
Geräte, die hardwarebeschleunigte Transformations- und Beleuchtungsvorgänge (T&L HAL Device) unterstützen, beschleunigen auch die Transformation von Texturkoordinaten. Wenn die Hardwarebeschleunigung von Transformationen nicht verfügbar ist, gelten plattformspezifische Optimierungen in der Direct3D-Geometriepipeline für Texturkoordinatentransformationen.
Texturkoordinatentransformationen sind nützlich, um Spezielle Effekte zu erzeugen, ohne die Texturkoordinaten Ihrer Geometrie direkt ändern zu müssen. Sie können einfache Übersetzungs- oder Rotationsmatrizen verwenden, um Texturen für ein Objekt zu animieren, oder Sie können Texturkoordinaten transformieren, die automatisch von Direct3D generiert werden, um erweiterte Effekte wie projizierte Texturen und dynamische Lichtzuordnungen zu vereinfachen und möglicherweise zu beschleunigen. Darüber hinaus können Sie Texturkoordinatentransformationen verwenden, um einen einzelnen Satz von Texturkoordinaten für mehrere Zwecke in mehreren Texturphasen wiederzuverwenden.
Festlegen und Abrufen von Texturkoordinatentransformationen
Wie die Matrizen, die Ihre Anwendung für geometrie verwendet, legen Sie Texturkoordinatentransformationen fest und rufen sie ab, indem Sie die Methoden IDirect3DDevice9::SetTransform und IDirect3DDevice9::GetTransform aufrufen. Diese Methoden akzeptieren die D3DTS_TEXTURE0 über D3DTS_TEXTURE7 Member des aufgezählten D3DTRANSFORMSTATETYPE-Typs , um die Transformationsmatrizen für die Texturphasen 0 bis 7 zu identifizieren.
Der folgende Code legt eine Matrix fest, die auf die Texturkoordinaten für Texturstufe 0 angewendet werden soll.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
D3DMATRIX matTrans = D3DXMatrixIdentity( NULL );
// Set up the matrix for the desired transformation.
d3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );
Aktivieren von Texturkoordinatentransformationen
Der D3DTSS_TEXTURETRANSFORMFLAGS Zustand der Texturphase steuert die Anwendung von Texturkoordinatentransformationen. Werte für diesen Zustand der Texturphase werden durch den aufgezählten D3DTEXTURETRANSFORMFLAGS-Typ definiert.
Texturkoordinatentransformationen sind deaktiviert, wenn D3DTSS_TEXTURETRANSFORMFLAGS auf D3DTTFF_DISABLE (Standardwert) festgelegt ist. Vorausgesetzt, dass Texturkoordinatentransformationen für Phase 0 aktiviert wurden, werden sie im folgenden Code deaktiviert.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_DISABLE );
Die anderen in D3DTEXTURETRANSFORMFLAGS definierten Werte werden verwendet, um Texturkoordinatentransformationen zu aktivieren und zu steuern, wie viele resultierende Texturkoordinatenelemente an den Rasterisierer übergeben werden. Nehmen Sie beispielsweise den folgenden Code.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
Der D3DTTFF_COUNT2-Wert weist das System an, den Transformationsmatrixsatz für Texturstufe 0 anzuwenden und dann die ersten beiden Elemente der geänderten Texturkoordinaten an den Rasterisierer zu übergeben.
Das D3DTTFF_PROJECTED Texturtransformationsflag gibt Koordinaten für eine projizierte Textur an. Wenn dieses Flag angegeben wird, unterteilt das Rasterprogramm die übergebenen Elemente durch das letzte Element. Nehmen Sie beispielsweise den folgenden Code.
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT3 | D3DTTFF_PROJECTED );
In diesem Beispiel wird das System informiert, drei Texturkoordinatenelemente an den Rasterisierer zu übergeben. Der Rasterisierer teilt die ersten beiden Elemente durch das dritte und erzeugt die 2D-Texturkoordinaten, die zum Adressieren der Textur erforderlich sind.
Zugehörige Themen