2011-10-13 12 views
5

Ho bisogno di renderizzare un oggetto usando multi-texturing ma entrambe le trame hanno coordinate uv differenti per lo stesso oggetto. Uno è una mappa normale e l'altro è una mappa luminosa.OpenGL ES 1 multi-texturing con diverse coordinate uv

Si prega di fornire qualsiasi materiale utile in merito.

+0

Benvenuti in StackOverflow, spero che leggete le [FAQ] (http://stackoverflow.com/faq#howtoask). –

risposta

6

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.

+0

grazie per il tuo feedback.ora ho ritirato la mia domanda con opengles. fornisci gentilmente la soluzione su come farlo in OpenGL ES 1.permette di fornire qualsiasi codice di esempio, se disponibile. Grazie in anticipo. – rocksvick

+0

@rocksvick Hai aggiunto il tag opengl-es, ma non hai rimosso il tag opengl-es-2.0, né cambiato il titolo.Quindi hai bisogno solo di una soluzione OpenGL ES 1.1 o di una soluzione OpenGL ES 2.0 o entrambe? –

+0

Come da linee guida ho rimosso il tag opengl-es-2.0 e cambiato il titolo. Fornire gentilmente la soluzione e qualsiasi codice di esempio, se disponibile. Grazie – rocksvick