Che cosa fa cambiare GL_TEXTURE_WRAP) _ (S / T)?


12

Sto lavorando ad alcuni tutorial OpenGL per principianti e quello attuale insegna come applicare una trama a un semplice rettangolo. Gli stati del tutorial mi dicono di impostare i parametri di trama GL_TEXTURE_WRAP_S e GL_TEXTURE_WRAP_T su GL_CLAMP_TO_EDGE, tuttavia non sono sicuro di cosa faccia effettivamente. Sono consapevole che ha a che fare con il modo in cui vengono gestite le trame più grandi / più piccole dello spazio su cui vengono mappate, ma non sono sicuro del comportamento che ciò effettivamente provoca. Cosa fa GL_CLAMP_TO_EDGE e in cosa differisce da GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Grazie mille in anticipo e disponibilità del bonus se puoi fornire immagini per un idiota come me.

Risposte:


29

Bene S e T significano solo U e V (o X e Y se preferisci), o in GLSL:

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

La modalità GL_REPEAT ha ripetute trame quando si supera l'intervallo (0,0) - (1,1)

La modalità GL_CLAMP_TO_EDGE ha trame ferme all'ultimo pixel quando cadi dal bordo.

GL_CLAMP e GL_CLAMP_TO_BORDER sono ammortizzati perché tutti i bordi delle trame devono essere 0 pixel, quindi le modalità non hanno più senso. (da qualche parte intorno a GL3 credo)

Esistono più modalità, quindi assicurati di leggere i documenti. (Esempi: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Ci sono alcuni buoni esempi su http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , ecco un'anteprima:

Avvolgere S: GL_CLAMP / Avvolgere T: GL_CLAMP

morsetto morsetto

Avvolgere S: GL_CLAMP / Avvolgere T: GL_REPEAT

ripetizione del morsetto

Avvolgere S: GL_REPEAT / Avvolgere T: GL_CLAMP

ripetere il morsetto

Avvolgere S: GL_REPEAT / Avvolgere T: GL_REPEAT

ripeti ripeti


Grazie. Bella risposta. Sai se c'è qualche differenza tra GL_CLAMP_TO_EDGE e GL_CLAMP e se c'è comunque la possibilità di espandere la trama per riempire lo spazio disponibile?
w4etwetewtwet,

Ci scusiamo per non aver chiarito, dove dico CLAMP intendo GL_CLAMP_TO_EDGE, GL_CLAMP è andato nel moderno OpenGL. Modificherò la risposta per enfatizzarla.
MickLH,

Per quanto riguarda "espansione" se intendi semplicemente allungare la trama in un intervallo diverso, questo dovrebbe essere gestito durante la parametrizzazione della mesh. (Mappatura UV, lavoro degli artisti). Se davvero devi farlo pragmaticamente, dovrai scrivere la tua formula da usare in uno shader. (O suppongo che la matrice GL_TEXTURE se la tua app è già gravemente obsoleta: P)
MickLH

4

Ecco un estratto della pagina di riferimento di OpenGL su glTexParameter a partire dal 2014/02/07, formattato un po 'per facilitare la lettura:

GL_TEXTURE_WRAP_S

Imposta il parametro Wrap per texture coordinano s a uno GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT o GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE fa sì che le coordinate di s vengano bloccate nell'intervallo gamma, dove N è la dimensione della trama nella direzione di bloccaggio.

  • GL_CLAMP_TO_BORDER valuta le coordinate s in modo simile a GL_CLAMP_TO_EDGE.
    Tuttavia, nei casi in cui il bloccaggio si sarebbe verificato in modalità GL_CLAMP_TO_EDGE, i dati texel recuperati vengono sostituiti con i valori specificati da GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT fa ignorare la parte intera della coordinata s ;
    il GL utilizza solo la parte frazionaria, creando così un motivo ripetuto.

  • GL_MIRRORED_REPEAT fa sì che la coordinata s sia impostata sulla parte frazionaria della coordinata della trama se la parte intera di s è pari; se la parte intera di s è dispari, allora la coordinata della trama s è impostata su 1-frac, dove fracrappresenta la parte frazionaria di s .

  • GL_MIRROR_CLAMP_TO_EDGE fa sì che le coordinate s vengano ripetute come per GL_MIRRORED_REPEAT per una ripetizione della trama, a quel punto la coordinata da bloccare come in GL_CLAMP_TO_EDGE.

Inizialmente, GL_TEXTURE_WRAP_S è impostato su GL_REPEAT .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.