![]() ![]() ![]() |
|
![]() |
|
![]() |
![]() ![]() ![]() |
Welche Adressing Modes es gibt und was diese bewirken, haben Sie bereits im Kapitel Informationen zu Texturen gelernt. Daher beschreibe ich hier nur kurz, wie man diese Adressing Modes in Delphi setzt.
Sie können jeweils für die X- und für die Y-Achse bestimmen, welche Texturadressierung verwendet werden sollen, wobei X und Y bei Texturkoordinaten immer U und V genannt werden.
d3ddev8.SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_MIRROR); d3ddev8.SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_BORDER); d3ddev8.SetTextureStageState(0, D3DTSS_BORDERCOLOR, D3DCOLOR_RGBA(204, 108, 57)); |
In diesem Beispiel werden also alle Pixel auf der U-Achse (= X-Achse) ausserhalb des Bereiches [0, 1] gespiegelt. Auf der V-Achse dagegen wird eine Rahmenfarbe angezeigt, die Sie mit dem Flag D3DTSS_BORDERCOLOR wählen können. D3DTADDRESS_MIRROR usw. sind Konstanten aus der D3DTEXTUREADDRESS-Aufzählung
Haben Sie schonmal darüber nachgedacht, wie eigentlich Spiegelungen in 3D-Anwendungen erzielt werden? Alle virtuellen Lichtstrahlen zu berechnen, um dann entscheiden zu können, welcher Gegenstand aus der Umgebung reflektiert wird, und welcher nicht, wäre viel zu aufwendig für heutige Echtzeit-3D-Spiele. Der Trick ist, die Umgebung des Spiegels aus Sicht des Spiegels in eine Textur zu rendern, und diese dann über den Spiegel zu ziehen. Wie man eine Szene in eine Textur rendert, erfahren Sie im Kapitel Textur bearbeiten. Wie man jedoch eine augenscheinlich physikalisch korrekte Spiegelung hinbekommt, lesen Sie hier.
Es gibt vier verschiedene Möglichkeiten Texturkoordinaten zu definieren. Eine davon nutzen wir bereits, nämlich die standardmässige. Das heisst, die Textur wird anhand der Texturkoordinaten, die jeder Vertex enthält angezeigt. Diese Darstellungsmöglichkeit vermittelt uns einen Eindruck von der Beschaffenheit eines 3D-Objektes. Die Textur gehört halt zum Objekt. Anders verhält es sich, wenn wir die Texturkoordinaten von anderen Dingen abhängig machen.
D3DDEV8.SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR ); |
D3DTSS_TEXCOORDINDEX ist das Flag, mit dem Sie angeben, dass Sie die Texturkoordinaten neu setzen möchten. Mit D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR erreichen Sie diesen Spiegeleffekt.
Sie haben folgende vier Konstanten zur Auswahl:
D3DTSS_TCI_PASSTHRU:
Die Texturkoordinaten der Vertices werden verwendet. Dies ist die gängige Methode bei der es den Anschein hat, als ob das Objekt aus den Farben der Textur beschaffen ist.
D3DTSS_TCI_CAMERASPACENORMAL:
Die Textur wird immer orthogonal zur Kamera ausgerichtet. Die Texturkoordinaten sind die Orte, an denen sich die Normalen der Vertices auf der Textur befinden.
D3DTSS_TCI_CAMERASPACEPOSITION:
Die Textur wird immer orthogonal zur Kamera ausgerichtet. Sie sehen die Textur nur da, wo sich auch das Objekt befindet.
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR:
Berechnet einen Reflektionsvektor aus den Vertexkoordinaten, der Normale und der Kameraposition.
Eines der vielen Samples aus der SDK zeigt die Anwendung des Cameraspace-Reflection-Vektors:
Texturen, bei denen man den Eindruck hat, sie werden von dem 3D-Objekt nur reflektiert, bezeichnet man auch als Environmentmap, als Umgebungstextur.
Kurz zur sachlichen Unterscheidung: im Kapitel Texturkoordinaten setzen geht es darum, wie die Texturkoordinaten der Vertices ermittelt werden. In diesem Kapitel beschäftigen wir uns damit, wie wir die ermittelten Texturkoordinaten transformieren können. Diese Transformierungen finden innnerhalb der üblichen 4x4 Matrix statt, wobei in diesem Fall allerdings nur die ersten beiden Spalten von wirklicher Relevanz sind, da wir uns bisher ja nur mit zweidimensionalen Texturen befassen.
Texturkoordinaten transformieren | |||||
{ | 1 | 0 | 0 | 0 | } |
0 | 1 | 0 | 0 | ||
0 | 0 | 1 | 0 | ||
0 | 0 | 0 | 1 |
Was für 3D-Objekte gilt, ist für Texturen nicht anders. Durch Verändern der Parameter können Sie verschiedene Effekte erzielen, zum Beispiel einfache Verschiebungen (die untersten beiden Werte) oder Verzerrungen. Die Vielzahl der Möglichkeiten ist unbegrenzt. Sie alle hier aufzulisten ist daher leider nicht möglich.
Sie können für jedes einzelne Texturstage entscheiden, welche Transformationsmatrix Sie verwenden möchten. Dazu verwenden Sie die bekannte .SetTransform-Funktion:
d3ddev8.SetTransform(D3DTS_TEXTURE0, matrix); |
Darüber hinaus müssen Sie noch explizit einschalten, dass Sie Texturtransformationen vornehmen möchten. Dies erreichen Sie mit folgenden Parametern:
D3DDEV8.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); |
D3DTTFF_COUNT2 ist eine Konstante aus den D3DTEXTURETRANSFORMFLAGS, mit der Sie angeben, dass Sie eine zweidimensionale Textur verwenden. Standardmässig ist D3DTTFF_DISABLE aktiv, womit also keine Transformierung vorgenommen wird.