Was bewirkt das Ändern von GL_TEXTURE_WRAP) _ (S / T)?

11

Ich arbeite an einigen OpenGL-Tutorials für Anfänger, und das aktuelle zeigt, wie man eine Textur auf ein einfaches Rechteck anwendet. Der Tutorial-Status fordert mich auf, die Texturparameter GL_TEXTURE_WRAP_S und GL_TEXTURE_WRAP_T auf GL_CLAMP_TO_EDGE zu setzen. Ich bin mir jedoch nicht sicher, was dies tatsächlich bewirkt. Ich bin mir bewusst, dass dies damit zu tun hat, wie Texturen behandelt werden, die größer / kleiner als der Raum sind, auf den sie abgebildet werden, aber ich bin mir nicht sicher, welches Verhalten dies tatsächlich verursacht. Was macht GL_CLAMP_TO_EDGE und wie unterscheidet sich das von GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Vielen Dank im Voraus und zusätzliche Hilfsbereitschaft, wenn Sie Bilder für einen Idioten wie mich bereitstellen können.

w4etwetewtwet
quelle

Antworten:

29

Nun, S und T bedeuten nur U und V (oder X und Y, wenn Sie es vorziehen) oder in GLSL:

vec4.xyzw == vec4.rgba == vec4.strq

Im GL_REPEAT-Modus werden Texturen wiederholt, wenn Sie den Bereich (0,0) bis (1,1) überschreiten

Im GL_CLAMP_TO_EDGE-Modus werden Texturen am letzten Pixel angehalten, wenn Sie von der Kante fallen.

GL_CLAMP und GL_CLAMP_TO_BORDER werden abgeschrieben, da alle Texturränder 0 Pixel betragen müssen, sodass die Modi keinen Sinn mehr ergeben. (Ich glaube, irgendwo in der Nähe von GL3)

Es gibt weitere Modi. Lesen Sie daher unbedingt die Dokumente. (Beispiele: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Es gibt einige gute Beispiele auf http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml . Hier eine Vorschau:

Wrap S: GL_CLAMP / Wrap T: GL_CLAMP

Klemme Klemme

Wrap S: GL_CLAMP / Wrap T: GL_REPEAT

Klemmwiederholung

Wrap S: GL_REPEAT / Wrap T: GL_CLAMP

Klemme wiederholen

Wrap S: GL_REPEAT / Wrap T: GL_REPEAT

wiederholen wiederholen wiederholen

MickLH
quelle
Vielen Dank. Gute Antwort. Wissen Sie, ob es einen Unterschied zwischen GL_CLAMP_TO_EDGE und GL_CLAMP gibt und ob es sowieso nur darum geht, die Textur zu erweitern, um den verfügbaren Platz zu füllen?
w4etwetewtwet
Es tut mir leid, dass ich nicht geklärt habe, wo ich CLAMP sage. Ich meine GL_CLAMP_TO_EDGE. GL_CLAMP ist in modernem OpenGL verschwunden. Ich werde die Antwort bearbeiten, um das zu betonen.
MickLH
Was "Erweitern" betrifft, wenn Sie einfach das Strecken der Textur in einen anderen Bereich meinen, sollte dies während der Netzparametrierung behandelt werden. (UV-Mapping, Künstlerjob) .. Wenn Sie es wirklich pragmatisch machen müssen, müssen Sie Ihre eigene Formel schreiben, um sie in einem Shader zu verwenden. (Oder ich denke GL_TEXTURE Matrix, wenn Ihre App bereits stark veraltet ist: P)
MickLH
3

Hier ist ein Auszug aus der OpenGL-Referenzseite auf glTexParameter vom 07.02.2014, der zum leichteren Lesen etwas formatiert wurde:

GL_TEXTURE_WRAP_S

Setzt die Wrap - Parameter für Texturkoordinaten s auf beiden GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT oder GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE bewirkt, dass die s- Koordinaten auf den Bereich geklemmt werden Angebot, wobei N die Größe der Textur in Klemmrichtung ist.

  • GL_CLAMP_TO_BORDER auswertet s Koordinaten in ähnlicher Weise wie GL_CLAMP_TO_EDGE.
    In Fällen, in denen im GL_CLAMP_TO_EDGE-Modus eine Klemmung aufgetreten wäre, werden die abgerufenen Texeldaten durch die durch GL_TEXTURE_BORDER_COLOR angegebenen Werte ersetzt.

  • GL_REPEAT bewirkt, dass der ganzzahlige Teil der s- Koordinate ignoriert wird.
    Der GL verwendet nur den Bruchteil, wodurch ein sich wiederholendes Muster erzeugt wird.

  • GL_MIRRORED_REPEAT bewirkt, dass die s- Koordinate auf den Bruchteil der Texturkoordinate gesetzt wird, wenn der ganzzahlige Teil von s gerade ist. Wenn der ganzzahlige Teil von s ungerade ist, wird die Texturkoordinate s auf gesetzt 1-frac, wobei fracder Bruchteil von s dargestellt wird .

  • GL_MIRROR_CLAMP_TO_EDGE bewirkt, dass die s- Koordinate wie bei GL_MIRRORED_REPEAT für eine Wiederholung der Textur wiederholt wird. An diesem Punkt wird die Koordinate wie in GL_CLAMP_TO_EDGE geklemmt.

Zunächst wird GL_TEXTURE_WRAP_S auf GL_REPEAT gesetzt .

abwischen
quelle