Dans OpenGL ES 2, vous utilisez des shaders de toute façon. Vous êtes donc complètement libre d'utiliser les coordonnées de texture que vous aimez. Il suffit de présenter un attribut supplémentaire pour la seconde paire texture cooridnate et déléguer au fragment shader, comme d'habitude:
...
attribute vec2 texCoord0;
attribute vec2 texCoord1;
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
void main()
{
...
vTexCoord0 = texCoord0;
vTexCoord1 = texCoord1;
}
Et dans le fragment shader utiliser les coordonnées respectives pour accéder aux textures:
...
uniform sampler2D tex0;
uniform sampler2D tex1;
...
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;
void main()
{
... = texture2D(tex0, vTexCoord0);
... = texture2D(tex1, vTexCoord1);
}
Et bien sûr, vous devez fournir des données à ce nouvel attribut (en utilisant glVertexAttribPointer
). Mais si tout cela vous semble très étrange, alors vous devriez vous plonger un peu plus dans les shaders GLSL ou bien utiliser OpenGL ES 1. Dans ce cas, vous devriez repasser votre question et je mettrai à jour ma réponse. D'après votre mise à jour pour OpenGL ES 1, la situation est un peu différente selon votre mise à jour pour OpenGL ES 1. Je suppose que vous savez déjà comment utiliser une seule texture et spécifier les coordonnées de texture pour cela, sinon vous devriez commencer par là avant de vous lancer dans la multi-texturation.
Avec glActiveTexture(GL_TEXTUREi)
, vous pouvez activer l'unité de texture ith. Toutes les opérations suivantes liées à l'état de texture se réfèrent uniquement à l'unité de texture ith (comme glBindTexture
, mais aussi glTexEnv
et gl(En/Dis)able(GL_TEXTURE_2D)
).
Pour spécifier la texture que vous utilisez coordonnées encore la fonction glTexCoordPointer
, comme seule texturation, mais avec glCientActiveTexture(GL_TEXTUREi)
vous pouvez sélectionner l'unité de texture à laquelle les appels suivants à glTexCoordPointer
et glEnableClientAttrib(GL_TEXTURE_COORD_ARRAY)
se rapportent.
Donc, ce serait quelque chose comme:
//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);
La raison pour laquelle je mets les paramètres pour la deuxième texture avant la première texture est seulement pour que, après leur mise en nous nous retrouvons avec unité de texture 0 active. Je pense avoir déjà vu des pilotes faire des problèmes lors du dessin et une autre unité que l'unité 0 était active. Et c'est toujours une bonne idée de laisser un état plus ou moins propre à la fin, ce qui signifie que l'unité de texture par défaut (GL_TEXTURE0
) est active, sinon le code qui ne s'intéresse pas à la multi-texturation pourrait avoir des problèmes.
EDIT: Si vous utilisez le mode immédiat (glBegin/glEnd
) au lieu de tableaux de sommet, alors vous ne pas utiliser glTexCoordPointer
, bien sûr. Dans ce cas, vous n'avez pas non plus besoin de glClientAttribTexture
, bien sûr. Vous avez juste besoin d'utiliser glMultiTexCoord(GL_TEXTUREi, ...)
avec l'unité de texture appropriée (GL_TEXTURE0
, GL_TEXTURE1
, ...) au lieu de glTexCoord(...)
. Mais si je suis informé correctement, OpenGL ES n'a pas de mode immédiat, de toute façon.
Bienvenue dans StackOverflow, j'espère que vous avez lu la [FAQ] (http://stackoverflow.com/faq#howtoask). –