2011-10-13 1 views
5

J'ai besoin de rendre un objet en multi-texturant mais les deux textures ont des coordonnées UV différentes pour le même objet. L'une est une carte normale et l'autre est une carte de lumière.OpenGL ES 1 multi-texturation avec différentes coordonnées uv

Veuillez fournir tout matériel utile à ce sujet.

+0

Bienvenue dans StackOverflow, j'espère que vous avez lu la [FAQ] (http://stackoverflow.com/faq#howtoask). –

Répondre

6

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.

+0

merci pour vos commentaires. Maintenant j'ai remis ma question avec opengles. veuillez fournir la solution comment faire ceci dans OpenGL ES 1. Veuillez fournir n'importe quel exemple de code si disponible. Merci d'avance. – rocksvick

+0

@rocksvick Vous avez ajouté la balise opengl-es, mais vous n'avez pas supprimé la balise opengl-es-2.0, ni changé le titre.Vous n'avez donc besoin que d'une solution OpenGL ES 1.1 ou d'une solution OpenGL ES 2.0 ou les deux? –

+0

Conformément à vos directives, j'ai retiré la balise opengl-es-2.0 et changé le titre. Veuillez fournir la solution et tout exemple de code si disponible. Merci – rocksvick

Questions connexes