In OpenGL ES 2 si usano comunque gli shader. Quindi sei completamente libero di usare qualsiasi struttura di coordinate che ti piace. Basta introdurre un attributo aggiuntivo per la seconda coppia trama cooridnate e delegare tale allo shader frammento, come al solito:
...
attribute vec2 texCoord0;
attribute vec2 texCoord1;
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
void main()
{
...
vTexCoord0 = texCoord0;
vTexCoord1 = texCoord1;
}
E nello shader frammento utilizzare le rispettive coordinate per accedere alle trame:
...
uniform sampler2D tex0;
uniform sampler2D tex1;
...
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
void main()
{
... = texture2D(tex0, vTexCoord0);
... = texture2D(tex1, vTexCoord1);
}
E ovviamente è necessario fornire dati a questo nuovo attributo (usando glVertexAttribPointer
). Ma se tutto questo ti sembra molto estraneo, dovresti approfondire gli shader GLSL o usare OpenGL ES 1. In questo caso dovresti ripetere la domanda e aggiornerò la mia risposta.
MODIFICA: In base al vostro aggiornamento per OpenGL ES 1, la situazione è leggermente diversa. Presumo che tu sappia già come usare una singola trama e specificare le coordinate della trama per questo, altrimenti dovresti iniziare lì prima di scavare nella multi-texturing.
Con glActiveTexture(GL_TEXTUREi)
è possibile attivare l'unità di trama ith. Tutte le seguenti operazioni relative allo stato della trama si riferiscono solo alla unità di trama ith (come glBindTexture
, ma anche glTexEnv
e gl(En/Dis)able(GL_TEXTURE_2D)
).
Per specificare la texture coordinate si utilizza ancora la funzione glTexCoordPointer
, come con il singolo texturing, ma con glCientActiveTexture(GL_TEXTUREi)
è possibile selezionare l'unità di texture per cui seguenti chiamate a glTexCoordPointer
e glEnableClientAttrib(GL_TEXTURE_COORD_ARRAY)
riferiscono.
Quindi sarebbe qualcosa di simile:
//bind and enable textures
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, <second texture>);
glTexEnv(<texture environment for second texture>); //maybe, if needed
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <first texture>);
glTexEnv(<texture environment for first texture>); //maybe, if needed
glEnable(GL_TEXTURE_2D);
//set texture coordinates
glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer(<texCoords for second texture>);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(<texCoords for first texture>);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//other arrays, like glVertexPointer, ...
glDrawArrays(...)/glDrawElements(...);
//disable arrays
glClientActiveTexture(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
//disable textures
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);
Il motivo per cui impostare i parametri per la seconda trama prima che la prima trama è solo in modo che dopo di loro creazione si finisce con l'unità di tessitura 0 attiva. Penso di aver già visto i driver che creano problemi durante il disegno e un'altra unità rispetto all'unità 0 attiva. Ed è sempre una buona idea lasciare uno stato più o meno pulito alla fine, il che significa che l'unità di texture di default (GL_TEXTURE0
) è attiva, altrimenti il codice che non interessa la multi-texturing potrebbe avere problemi.
EDIT: Se si utilizza la modalità immediata (glBegin/glEnd
) al posto di array di vertice, quindi non si utilizza glTexCoordPointer
, naturalmente. In questo caso, inoltre, non è necessario il glClientAttribTexture
, naturalmente. È sufficiente utilizzare glMultiTexCoord(GL_TEXTUREi, ...)
con l'unità di texture appropriata (GL_TEXTURE0
, GL_TEXTURE1
, ...) anziché glTexCoord(...)
. Ma se sono informato correttamente, OpenGL ES non ha comunque la modalità immediata.
Benvenuti in StackOverflow, spero che leggete le [FAQ] (http://stackoverflow.com/faq#howtoask). –