2012-02-20 2 views
2

Tout d'abord, je suis nouveau sur OpenGL, mais sur mon téléphone (Motorola Bionic) le code suivant fonctionne comme prévu.Android OpenGL ES2.0 Echange de texture

GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTowerTextureHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE2); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTowerNormalHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE3); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFrostTextureHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE4); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFrostNormalHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE5); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFireTextureHandle); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE6); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFireNormalHandle); 

... 
for (int i =0; i < mGame.towers.length; i++) 
{ 
switch (mGame.towers[i].type) 
{ 
case Dart: 
    GLES20.glUniform1i(mTextureUniformHandle, 1); 
    GLES20.glUniform1i(mTextureNormalUniformHandle, 2); 
    break; 
case Frost: 
    GLES20.glUniform1i(mTextureUniformHandle, 3); 
    GLES20.glUniform1i(mTextureNormalUniformHandle, 4); 
    break; 
case Fire: 
    GLES20.glUniform1i(mTextureUniformHandle, 5); 
    GLES20.glUniform1i(mTextureNormalUniformHandle, 6); 
    break; 
} 
... 
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6); 
} 

Il affichera la texture correcte et normale pour chaque tour. Sur les anciens téléphones (mes amis Incredible), il affiche simplement toutes les tours avec la texture du dernier type en train d'être dessiné. Je pourrais juste échanger la texture correcte à Texture1 pour chaque tour, mais n'est-ce pas plus lent et méprisé?

Quelqu'un at-il des informations sur les raisons pour lesquelles cela ne fonctionne pas sur certains téléphones et sur ce que je dois faire pour le rendre compatible avec tous les téléphones compatibles OpenGLES20?

Répondre

3

Vous frappez probablement une limite de textures active maximale, par exemple comme docs dit:

glActivateTexture - Le nombre d'unités de texture dépend mise en œuvre, mais il doit être au moins deux

Vous pouvez également vérifier GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (avec glGet).

Pour problème de débogage, vous pouvez vérifier glGetError après chaque appel glActiveTexture/glBindTexture et peut-être les glUniform1i.