2011-10-13 10 views
5

Çoklu tekstüre kullanarak bir nesne oluşturmam gerekiyor, ancak her iki doku da aynı nesne için farklı uv koordinatlarına sahip. Biri normal harita ve diğeri ışık haritası.OpenGL ES 1 farklı uv koordinatlarıyla çoklu tekstüre

Lütfen bu konuda yararlı bilgiler sağlayınız.

+0

StackOverflow'a hoş geldiniz, umarım [FAQ] 'u okuyun (http://stackoverflow.com/faq#howtoask). –

cevap

6

OpenGL ES 2'de gölgelendiricileri kullanın. Yani istediğin doku koordinatlarını kullanmakta tamamen özgürsün. Sadece ikinci doku cooridnate çifti için ek bir özellik tanıtmak ve parça gölgelendirici bu temsilci zamanki gibi:

... 
uniform sampler2D tex0; 
uniform sampler2D tex1; 
... 
varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... = texture2D(tex0, vTexCoord0); 
    ... = texture2D(tex1, vTexCoord1); 
} 

:

... 
attribute vec2 texCoord0; 
attribute vec2 texCoord1; 

varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... 
    vTexCoord0 = texCoord0; 
    vTexCoord1 = texCoord1; 
} 

Ve parça gölgelendirici dokular erişmek için ilgili koordinatları kullanmak

Ve elbette bu yeni özniteliğe veri sağlamanız gerekir ( glVertexAttribPointer kullanarak). Fakat tüm bunlar size çok yabancı geliyorsa, ya GLSL gölgelendiricilere biraz daha derinlemesine bakmalısınız ya da aslında OpenGL ES 1 kullanıyorsunuz. Bu durumda sorunuzu yeniden etiketlemelisiniz ve cevabımı güncelleyeceğim.

DÜZENLEME: OpenGL ES 1 güncellemenize göre durum biraz farklı. Tek bir doku kullanmayı ve bunun için doku koordinatlarını nasıl belirleyeceğinizi zaten biliyorsunuzdur, aksi halde çoklu tekstüre işlemeden önce orada başlamalısınız.

glActiveTexture(GL_TEXTUREi) ile ith doku birimini etkinleştirebilirsiniz. Doku durumuyla ilgili aşağıdaki tüm işlemler sadece ith doku birimine karşılık gelir (glBindTexture, aynı zamanda glTexEnv ve glTexEnv ve gl(En/Dis)able(GL_TEXTURE_2D)). dokusunu belirterek İçin

yine tek tekstüre ile olduğu gibi, glTexCoordPointer işlevini kullanın koordinatları, ancak glCientActiveTexture(GL_TEXTUREi) ile size glTexCoordPointer ve glEnableClientAttrib(GL_TEXTURE_COORD_ARRAY) için aşağıdaki çağrılar başvurmak için doku birimi seçebilirsiniz.

Yani olurdu gibi bir şey:

//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); 

ilk doku ermeden ikinci doku parametrelerini ayarlamak sebebi sadece bunları ayarladıktan sonra biz doku ünitesine aktif 0 ile bitirmek böylece. Bence çizim yaparken ve ünite 0'ın aktif olduğundan başka bir ünite oluştururken problemler çıkardığını gördüm. Ve her zaman, daha fazla ya da daha az temiz bir durum bırakmak her zaman iyi bir fikirdir, yani, varsayılan doku birimi (GL_TEXTURE0) aktiftir, aksi halde çoklu tekstüre ile ilgilenmeyen kodlar sorunlara yol açabilir.

DÜZENLEME: Eğer acil modu (glBegin/glEnd) yerine köşe dizileri kullanırsanız, o zaman tabii ki glTexCoordPointer kullanmayın. Bu durumda, elbette glClientAttribTexture'a da ihtiyacınız yoktur. glMultiTexCoord(GL_TEXTUREi, ...)'u glTexCoord(...) yerine uygun doku birimiyle (GL_TEXTURE0, GL_TEXTURE1, ...) kullanmanız yeterlidir. Ama eğer doğru bir şekilde bilgilendirildiysem, OpenGL ES'nin her an acil modu yoktur.

+0

geri bildiriminiz için teşekkürler. Opengles ile sorumu tekrar aldım. Lütfen OpenGL ES'de bunu nasıl yapacağınıza dair çözümü sağlayın. Varsa lütfen herhangi bir örnek kod sağlayın. Şimdiden teşekkürler. – rocksvick

+0

@rocksvick opengl-es etiketini eklediniz, ancak opengl-es-2.0 etiketini kaldırmadınız veya başlığı değiştirmediniz.Yani sadece bir OpenGL ES 1.1 çözümüne mi yoksa bir OpenGL ES 2.0 çözümüne mi ihtiyacınız var? –

+0

Yönergelerinize göre opengl-es-2.0 etiketini kaldırdım ve başlığı değiştirdim. Varsa, çözümü ve herhangi bir örnek kodu sağlayın. Teşekkürler – rocksvick