Domanda

Come posso ripetere una selezione di un atlante di texture?

Ad esempio, il mio sprite (selezione) si trova all'interno delle coordinate della texture:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};

Quindi voglio ripetere quello sprite N volte ad una striscia triangolare (o quadrupla) definita da:

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};

So che ha qualcosa a che fare con GL_REPEAT e textureCoords hanno superato l'intervallo [0,1].Questo però non funziona:(cercando di ripetere N = 10)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};

Stiamo vedendo ripetuto il nostro atlante completo delle texture...

Come potrei farlo nel modo giusto?

È stato utile?

Soluzione

Non può essere fatto nel modo in cui è descritto nella domanda. Le modalità di coordinate delle trame di OpenGL si applicano solo per l'intera trama.

Normalmente, per ripetere una trama, si disegna un poligono che è " più grande " di quanto la tua trama implichi. Ad esempio, se avessi una trama quadrata che desideri ripetere più volte (diciamo sei) su un'area più grande, disegneresti un rettangolo sei volte più largo che alto. Quindi imposta le coordinate della trama su (0,0) - (6,1) e la modalità trama su & Quot; ripeti & Quot ;. Quando si interpola attraverso il poligono, la coordinata della trama che va oltre 1 sarà, a causa dell'abilitazione della ripetizione, & Quot; avvolge & Quot; nella trama, facendo sì che la trama venga mappata sei volte attraverso il rettangolo.

Nessuna delle modalità di avvolgimento delle trame supporta il tipo di operazione come descritto nella domanda, ovvero tutte mappano sull'intero intervallo [0,1], non su un sottoinsieme arbitrario. quando stai texturizzando usando solo una parte della trama, non c'è modo di specificare quella coordinata di trama più grande in un modo che faccia ripetere OpenGL solo all'interno del rettangolo secondario.

Fondamentalmente hai due possibilità: o creare una nuova trama che abbia solo lo sprite di cui hai bisogno dalla trama esistente o scrivere un programma vertice GLSL per mappare le coordinate della trama in modo appropriato.

Altri suggerimenti

Non sono sicuro che tu possa farlo. Penso che le modalità di coordinate delle trame di OpenGL si applichino solo per l'intera trama. Quando si utilizza un atlante, si sta utilizzando & Quot; sottotitoli & Quot ;, in modo che le coordinate della trama non si avvicinino mai a 0 e 1, i limiti normali in cui si verificano avvolgimento e bloccaggio.

Potrebbero esserci delle estensioni per risolvere questo problema, non ho verificato.

EDIT: normalmente, per ripetere una trama, disegneresti un poligono che è " più grande " di quanto la tua trama implichi. Ad esempio, se avessi una trama quadrata che desideri ripetere più volte (diciamo sei) su un'area più grande, disegneresti un rettangolo sei volte più largo che alto. Quindi imposta le coordinate della trama su (0,0) - (6,1) e la modalità trama su & Quot; ripeti & Quot ;. Quando si interpola attraverso il poligono, la coordinata della trama che va oltre 1 sarà, a causa dell'abilitazione della ripetizione, & Quot; avvolge & Quot; nella trama, facendo sì che la trama venga mappata sei volte attraverso il rettangolo.

Questo è un po 'rozzo da spiegare senza immagini.

Ad ogni modo, quando stai texturizzando usando solo una parte della trama, non c'è modo di specificare quella coordinata di trama più grande in un modo che faccia ripetere a OpenGL solo nel sotto-rettangolo.

Nessuna delle modalità di avvolgimento texture supporta il tipo di operazione che stai cercando, ovvero tutte mappano sull'intero range [0,1], non su un sottoinsieme arbitrario. Fondamentalmente hai due possibilità: o creare una nuova trama che abbia solo lo sprite di cui hai bisogno dalla trama esistente o scrivere un programma pixel GLSL per mappare le coordinate della trama in modo appropriato.

Anche se questo potrebbe essere un vecchio argomento;ecco come ho finito per farlo:

Una soluzione alternativa sarebbe quella di creare più mesh, incollate insieme contenenti il ​​sottoinsieme di Texture UV.

Per esempio.:Ho una texture laser contenuta in un atlante di texture più grande, a U[0,05 - 0,1] e V[0,05-0,1].

Costruirò quindi N mesh, ciascuna avente le coordinate U[0,05-0,1] e V[0,05-0,1].(N = lunghezza / trama.altezza;l'altezza è la dimensione della trama che vorrei ripetere.O più semplice:il numero di volte in cui voglio ripetere la texture.)

Questa soluzione sarebbe più conveniente rispetto al dover ricaricare texture dopo texture.Soprattutto se esegui in batch tutte le chiamate di rendering (come dovresti).

(OpenGL ES 1.0,1.1,2.0 - Hardware mobile 2011)

Impossibile eseguire ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top