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.
StackOverflow'a hoş geldiniz, umarım [FAQ] 'u okuyun (http://stackoverflow.com/faq#howtoask). –