Android OpenGL ES2.0纹理交换

时间:2012-02-20 15:45:54

标签: android opengl-es-2.0 textures

首先我不熟悉OpenGL,但在我的手机上(摩托罗拉Bionic),以下代码按预期工作。

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

它将显示每个塔的正确纹理和法线。在较旧的手机上(我的朋友不可思议)它只显示所有塔,其中最后一种类型的纹理被绘制。我可以为每个塔交换正确的纹理到Texture1,但是不是那么慢而且看不起来了吗?

有没有人知道为什么它不能用于某些手机以及我需要做些什么来使其符合所有OpenGLES20兼容手机?

1 个答案:

答案 0 :(得分:3)

你可能达到了一些最大活动纹理的限制,例如文档说:

  

glActivateTexture - 纹理单位的数量是   实现依赖,但必须至少两个

此外,您可能需要检查GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS(使用glGet)。

要调试问题,您可能希望在每次通话glGetError / glActiveTexture之后检查glBindTexture,也许可以检查glUniform1i