[OpenGL] Multitexturing

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
cbadboy
Beiträge: 7
Registriert: 04.03.2010, 14:58

[OpenGL] Multitexturing

Beitrag von cbadboy »

Hallo,

ich versuche grad auf Basis eines Beispielmodells eines Freundes, dass er mir in max erstellt und nach ASE exportiert hat verschiedene
Texturmöglichkeiten für einen Modelloader zu testen. Das Modell basiert auf einer Box, an der beliebig texturen an verschiedenen Stellen
plaziert werden:

[IMG=http://www.image-share.com/upload/188/136m.bmp]
[IMG=http://www.image-share.com/upload/188/137.jpg]
[IMG=http://www.image-share.com/upload/188/138m.jpg]

Multitexturing funktioniert bei mir im einfachen Fall ohne Probleme. Ich kann ohne Schwierigkeiten mehrere Textureunits auf ein Plane
mappen, wobei alle Units die gleichen Texturkoordinaten verwenden:

Vertex lower left:
Pos (-5, -5, 0) Texture_1 (0,0) Texture_2 (? ?)

Vertex lower right:
Pos (5, -5, 0) Texture_1 (1,0) Texture_2 (? ?)

Vertex upper right:
Pos (5, 5, 0) Texture_1 (1,1) Texture_2 (? ?)

Vertex upper left:
Pos (-5, 5, 0) Texture_1 (0,1) Texture_2 (? ?)

Ich habe in der Spec gelesen, dass es auch möglich ist mehrere Texturkoordinaten für die unterschiedlichen Units zu definieren.
Nur hab ich hier ein Knoten im Kopf, wozu? Ich habe doch eh nur den Bereich 0-1 den ich schon für die 1. Textur verwende?

Wie bekomme ich es z.B. nachgestellt, das ich eine 2. Textur auf diesem Plane als Logo an eine beliebige Stelle plazieren kann?
Mir sagte man, das geht nur über zusätliche Geometrie oder Tiling des Planes in z.B. 100x100 Vertices um dann im 0.1er Bereich
die Textur frei plazieren zu können. Das ist doch aber viel zu Umständlich und zu teuer...

Wie machen die es z.B. in STO (Startrek Online). Da wird auf die Schiffstextur ein frei definierbares Logo und Textzug gemappt.
Ok, hier sind die Positionen fix, aber das müsste doch auch variabel gehen oder?

Hab im ASE file gesehen, dass sie für die einzelnen Materials UV-Offset und UV-Tiling Variablen verwenden. Wär dies evtl. ein
Ansatz zur Bestimmung der frei plazierbaren Texturen?
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [OpenGL] Multitexturing

Beitrag von Aramis »

Ich habe in der Spec gelesen, dass es auch möglich ist mehrere Texturkoordinaten für die unterschiedlichen Units zu definieren.
Nur hab ich hier ein Knoten im Kopf, wozu? Ich habe doch eh nur den Bereich 0-1 den ich schon für die 1. Textur verwende?
Mir ist nicht ganz klar was du damit meinst. Wenn die zweite Textur völlig `anders´ plaziert werden soll als die erste und ihre Platzierung auch nicht aus deren Texturkoordinaten ableitbar oder sonstwie prozedural festlegbar ist, so ist ein zweiter Satz Texturkoordinaten ununmgänglich. Das ASE Format unterstützt mehrere Channels.
Hab im ASE file gesehen, dass sie für die einzelnen Materials UV-Offset und UV-Tiling Variablen verwenden. Wär dies evtl. ein
Ansatz zur Bestimmung der frei plazierbaren Texturen?
Auch Rotationen werden vom ASE-Format unterstützt, glaube ich. Ergibt zusammen mit Skalierung («Tiling») und Translation («Offset») eine hinreichend flexible Transformierbarkeit. Meist würde man es so umsetzen, dass die Texturkoordinaten erst ganz am Ende - im Shader - mit der sich aus diesen Parametern ergebenden Transformationsmatrix transformiert werden. Somit kannst du dann nur durch Ändern der Matrix in jedem Frame auf's neue die Platzierung deiner Textur festlegen, ohne die eigentlichen Texturkoordinaten, die in einem VBO irgendwo im VRam liegen und ergo nur schwer erreichbar sind, ändern zu müssen. Natürlich ist das nur dann sinnvoll umsetzbar wenn der erste Satz Texturkoordinaten halbwegs `intuitiv´ der Modellgeometrie folgt und kaum UV-Seams aufweist. Eine kleine Textur nur auf einem Teil des Modells zu platzieren wäre dann durch hohes Tiling gepaart mit `CLAMP´ als Addressierungsmodus erreichbar.

- Alex

PS: Du solltest bei dieser Gelegenheit auch einen Blick auf den Link in meiner Signatur werfen. Assimp unterstützt das ASE-Format, und liest auch UV-Transformationen.
cbadboy
Beiträge: 7
Registriert: 04.03.2010, 14:58

Re: [OpenGL] Multitexturing

Beitrag von cbadboy »

Hallo Aramis,

danke ersteinmal für die schnelle Info.
Aramis hat geschrieben:
Mir ist nicht ganz klar was du damit meinst. Wenn die zweite Textur völlig `anders´ plaziert werden soll als die erste und ihre Platzierung auch nicht aus deren Texturkoordinaten ableitbar oder sonstwie prozedural festlegbar ist, so ist ein zweiter Satz Texturkoordinaten ununmgänglich. Das ASE Format unterstützt mehrere Channels
Das habe ich mir gedacht, aber wie? Wenn ich mir das Plane anschaue, dann habe ich ja für die erste Textur pro Vertex einen Value definiert. Soweit alles klar, nun will ich eine 2. Textur mappen und benötige wie Du beschrieben hast auch neue Koordinaten. Nur welche? Soll die 2. Textur wie auf dem Box Bild z.B. zentriert in der Mitte plaziert werden, welche Koordinaten werden dann genommen? Die linke untere Ecke ist 0,0, die linke untere rechte 0,1 was für eine Koordinate wär die Hälfte auf halber Höhe? 0.5 macht ja keinen Sinn, denn dann mappe ich ja nur einen größeren Ausschnitt ...
Aramis hat geschrieben:
Natürlich ist das nur dann sinnvoll umsetzbar wenn der erste Satz Texturkoordinaten halbwegs `intuitiv´ der Modellgeometrie folgt und kaum UV-Seams aufweist. Eine kleine Textur nur auf einem Teil des Modells zu platzieren wäre dann durch hohes Tiling gepaart mit `CLAMP´ als Addressierungsmodus erreichbar.
Holla, da hast Du mich jetzt aber überfahren :D Kannst Du das für nen DAU auch noch mal anders ausdrücken? Vielleicht auch orientiert an meinem Beispiel?
Deinen Link schau ich mir auf jeden Fall gleich einmal an....
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [OpenGL] Multitexturing

Beitrag von Aramis »

Soll die 2. Textur wie auf dem Box Bild z.B. zentriert in der Mitte plaziert werden, … Die linke untere Ecke ist 0,0, die linke untere rechte 0,1 was für eine Koordinate wär die Hälfte auf halber Höhe? 0.5 macht ja keinen Sinn, denn dann mappe ich ja nur einen größeren Ausschnitt ...
Beispielsweise könnten die 2. Koordinaten auf der Boxseite jeweils zwischen -1 und 2 liegen. Wenn Texturtiling aktiviert ist, so würde die kleine Textur genau 3² mal wiederholt werden. Wenn du den Texturaddressierungsmodus stattdessen aber auf clamp oder wrap-to-border setzt (siehe GL_CLAMP_TO_EDGE, GL_CLAMP, GL_CLAMP_TO_BORDER) einsetzt, kannst Du alle Duplikate außerhalb 0…1 quasi abschneiden und durch eine neutrale Farbe ersetzen, die abhängig von deinen Blend-Settings die originale Texturfarbe der Primärtextur nicht beeinflusst (wenn Du einfach nur beide Texturen miteinander multiplizierst wäre das Weiß, bei echtem Alphablending wäre es Transparenz). Es ist aber nicht ganz trivial das ganze sauber hinzukriegen insbesondere in Zusammenhang mit qualitativ hochwertiger Texturfilterung und MIP-Maps.

Das Stichwort «Decals» sollte dazu genug Informationen zutage fördern.

- Alex
cbadboy
Beiträge: 7
Registriert: 04.03.2010, 14:58

Re: [OpenGL] Multitexturing

Beitrag von cbadboy »

Super, danke für die Info, jetzt ist alles klarer und sollte kein Problem darstellen :D Übrigens, netten Loader habt Ihr da
implementiert ...
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [OpenGL] Multitexturing

Beitrag von Aramis »

> Übrigens, netten Loader habt Ihr da implementiert ...
Danke! Ich kann dir nur raten Assimp zu nutzen, denn 3D-Loader haben die unangenehme Eigenschaft auf Dauer viel Arbeit zu machen :-)
Antworten