Warum ist es möglich, auf eine Texturkoordinate zu stoßen, die größer als 1 oder kleiner als 0 ist?

11

Ich studiere einen Text über texture mappingund in der preparing to drawSitzung lese ich:

Definieren Sie die Texturumbruchparameter. Dies steuert, was passiert, wenn eine Texturkoordinate größer als 1,0 oder kleiner als 0,0 auftritt:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

Dabei ist Wrap: GL_REPEAT :
Gibt an, dass dieses Muster wiederholt wird (dh Wrap-Around), wenn transformierte Texturkoordinaten von weniger als 0,0 oder mehr als 1,0 auftreten.

GL_CLAMP: Gibt an, dass das Muster bei 0,0 oder 1,0 bleibt.

Aber es gibt keine Erklärung, warum solche Texturkoordinaten auftreten?
Angenommen, ich habe gerade ein Rechteck gezeichnet und möchte ein Bild als Textur darauf anwenden. Ist es möglich, auf solche Koordinaten zu stoßen?

Sepideh Abadpour
quelle

Antworten:

5

Nicht alle Texturen verwenden Texturkoordinaten, die aus den Netzdaten stammen. Mit projektiver Texturierung transformieren Sie beispielsweise die Welt in den Raum der Textur. Nun, ein Großteil dieser Welt liegt außerhalb des [0, 1] -Bereichs der Textur. Ohne einen Klemmmodus treten Probleme auf.

Nicol Bolas
quelle
10

Genau, um eine Textur zu wiederholen.

Wenn Sie also ein Quad haben und die Texturkoordinaten von 0 auf 1 gehen, wird die Textur einmal gezeichnet. Wenn die Koordinaten von 0 auf 2 gehen und der Umbruch auf eingestellt ist GL_REPEAT, wird die Textur zweimal gezeichnet.

Probieren Sie es aus und sehen Sie es selbst

Panda Pyjama
quelle
ok @Panda Pyjama also für einen Code wie diesen: float x0 = 0; // obere linke Ecke des Bildes float y0 = 0; float x1 = x0 + ImageWidth; // untere rechte Ecke des Bildes float y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } Es gibt keine Möglichkeit, Texturkoordinaten außerhalb des Intervalls (0,1) zu finden.
Sepideh Abadpour
1
@sepideh: Natürlich nicht. Sie haben Ihre Texturkoordinaten speziell im Bereich [0, 1] gehalten. Was Sie nicht verstehen, ist, dass Sie nicht müssen ; du hättest sie alles machen können. Veröffentlichen Sie auch keinen Code in Kommentaren. Wenn Sie eine Klarstellung wünschen, bearbeiten Sie Ihre Frage.
Nicol Bolas
ok, danke für deine Anleitung zur Übergabe von Codes an meine Frage. Ich habe nach einer Möglichkeit gesucht, Codes in Befehlen zu formatieren, konnte sie aber nicht finden !!! Sie meinen also, dass das Auffinden solcher Koordinaten kein zur Laufzeit mögliches Ereignis ist. Es wird vom Programmierer nur klar angegeben, um die Textur zu wiederholen oder nicht.
Sepideh Abadpour
1
@sepideh Was bedeutet "kein mögliches Laufzeitereignis"? Es ist vollkommen in Ordnung, Ihren Code im Kommentar zu ändern, glTexCoord2f(0, 2);um ihn beispielsweise zu haben . Dies hat sowohl im Code als auch beim Ausführen des Programms eine sehr genau definierte Bedeutung. Wenn Sie dies sehen, hat der Programmierer dies absichtlich getan, weil es das gewünschte Ergebnis liefert.
Joseph Mansfield
2
@sepideh Natürlich. OpenGL verwendet alle von Ihnen angegebenen Werte. Wenn Sie Werte im Bereich von 0 bis 1 angeben, erhalten Sie nie etwas anderes.
Joseph Mansfield
5

Ja, Sie können auf Texturkoordinaten stoßen, die größer als 1.0und kleiner als sind 0.0.

Dies hängt vollständig von dem Modell ab, das Sie geladen haben. Normalerweise werden für jeden Scheitelpunkt Position, Normal und Texturkoordinate gespeichert. In den meisten Netzdateiformaten ist die Texturkoordinate nicht auf einen Bereich beschränkt.

Dies wird verwendet, um eine Textur zu wiederholen . Um zum Beispiel eine Textur vier Mal zwischen einem Quad von Eckpunkten zu überbrücken, wäre die Texturkoordinaten 0,0, 0,4, 4,0und 4,4. Ohne Textur Verpackung, würden Sie zusätzliche Eckpunkte müssen die Oberfläche in 4 mal 4 Teilflächen mit jeweils den Texturkoordinaten spalten 0,0, 0,1, 1,0, 1,1. Weniger Eckpunkte führen zu einer besseren Renderleistung.

Typischerweise ist es nicht erwünscht, dass der Benutzer die Kanten einer wiederholten Textur bemerkt. Daher sind wiederholte Texturen in den meisten Fällen kachelbar. Dann wird die rechte Kante nahtlos zur linken und die obere zur unteren Kante ausgeblendet. Auf diese Weise ist der Übergang reibungslos und hoffentlich nicht vom Benutzer bemerkt.

Ein fortgeschritteneres, aber verwandtes Thema ist es, die Tatsache, dass dieselbe Textur mehrmals wiederholt wurde, geschickt zu verschleiern. Zum Beispiel ist das Mischen von wiederholten Texturen unterschiedlicher Größe, zum Beispiel einer Wandtextur und einem Schmutzaufkleber, eine übliche Technik.

Danijar
quelle
Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Das ist eine echte praktische Erklärung! Vielen Dank!
Amit Tomar