Perché è possibile incontrare una coordinata di trama maggiore di 1 o minore di 0


11

Sto studiando un testo su texture mappinge nella preparing to drawsessione ho letto:

Definire i parametri di avvolgimento della trama. Questo controllerà cosa succede quando si incontra una coordinata di trama maggiore di 1.0 o inferiore a 0.0:

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

dove avvolge è:
GL_REPEAT: specifica che questo modello si ripeterà (ovvero avvolgendo) se si incontrano coordinate di trama trasformate inferiori a 0,0 o superiori a 1,0.

GL_CLAMP: specifica che il modello si "attaccherà" al valore a 0,0 o 1,0.

Ma non c'è spiegazione qual è la ragione per incontrare tali coordinate di trama?
Ad esempio supponiamo di aver appena disegnato un rettangolo e di voler applicare un'immagine come trama su di essa, è possibile incontrare tali coordinate?

Risposte:


5

Non tutte le trame usano coordinate di trama che provengono dai dati mesh. Ad esempio, con la trama proiettiva , trasformi il mondo nello spazio della trama. Bene, gran parte di quel mondo non rientra nell'intervallo [0, 1] della trama. Senza una sorta di modalità di bloccaggio in atto, avrai problemi.


10

Precisamente, per ripetere una trama.

Pertanto, se si dispone di un quadrante e le coordinate della trama vanno da 0 a 1, la trama verrà disegnata una volta. Se le coordinate vanno da 0 a 2 e il ritorno a capo è impostato su GL_REPEAT, la trama verrà disegnata due volte.

Provalo e guardalo da solo


ok @Panda Pajama quindi per un codice come questo: float x0 = 0; // angolo superiore sinistro dell'immagine float y0 = 0; float x1 = x0 + ImageWidth; // angolo inferiore destro dell'immagine 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); } non è possibile incontrare coordinate di trama oltre l'intervallo (0,1)?
Sepideh Abadpour,

1
@sepideh: Certo che no. In particolare, hai mantenuto le coordinate della trama nell'intervallo [0, 1]. Quello che non capisci è che non devi farlo ; avresti potuto farli di tutto. Inoltre, non pubblicare un sacco di codice nei commenti. Se vuoi chiarimenti, modifica la tua domanda.
Nicol Bolas,

ok grazie per la tua guida sul passaggio di codici alla mia domanda. Stavo cercando un modo per formattare i codici nei comandi ma non sono riuscito a trovare !!! Quindi intendi incontrare tali coordinate non è un evento possibile di runtime. Viene semplicemente specificato chiaramente dal programmatore per ripetere o meno la trama.
Sepideh Abadpour,

1
@sepideh Cosa significa "evento non run-time possibile"? Va benissimo cambiare il codice nel commento per avere glTexCoord2f(0, 2);ad esempio. Questo ha un significato ben definito molto specifico sia nel codice che durante l'esecuzione del programma. Se vedi questo, il programmatore lo ha fatto intenzionalmente perché dà il risultato che vogliono.
Joseph Mansfield,

2
@sepideh Certo. OpenGL utilizza qualunque valore tu gli dia. Se gli dai valori compresi nell'intervallo da 0 a 1, non otterrai mai nient'altro.
Joseph Mansfield,

5

Sì, puoi trovare coordinate di trama maggiori 1.0e minori di 0.0.

Questo dipende completamente dal modello che hai caricato. Normalmente, per ogni vertice sono memorizzate la posizione, la normale e le coordinate della trama. Nella maggior parte dei formati di file mesh, le coordinate della trama non sono limitate a nessun intervallo.

Questo è usato per ripetere una trama . Ad esempio, misuri una struttura tempo quattro tra un quad di vertici, le coordinate della texture sarebbero 0,0, 0,4, 4,0e 4,4. Senza spostamento struttura, si avrebbe bisogno vertici aggiuntivi per dividere la superficie in 4 volte 4 superfici sub con ogni le coordinate della texture 0,0, 0,1, 1,0, 1,1. Meno vertici si traducono in migliori prestazioni di rendering.

In genere, non si desidera che l'utente noti i bordi di una trama ripetuta. Pertanto, le trame ripetute sono piastrellabili nella maggior parte dei casi. Ciò significa che il bordo destro si attenua senza soluzione di continuità a quello sinistro e il bordo superiore a quello inferiore. In questo modo, la transizione è regolare e si spera che l'utente non se ne accorga.

Un argomento più avanzato, ma correlato è quello di oscurare abilmente il fatto che la stessa trama è stata ripetuta più volte. Ad esempio, la fusione di trame ripetute di dimensioni diverse, ad esempio una trama a parete e una decalcomania dello sporco, è una tecnica comune.


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,1Questa è una vera spiegazione pratica! Grazie!
Amit Tomar,
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.