Android OpenGL ES2.0纹理交换

Android OpenGL ES2.0纹理交换,android,opengl-es-2.0,textures,Android,Opengl Es 2.0,Textures,首先,我是OpenGL新手,但在我的手机(摩托罗拉仿生)上,以下代码按预期工作 GLES20.glActiveTexture(GLES20.GL_TEXTURE1); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTowerTextureHandle); GLES20.glActiveTexture(GLES20.GL_TEXTURE2); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTowerNormalH

首先,我是OpenGL新手,但在我的手机(摩托罗拉仿生)上,以下代码按预期工作

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); 
}
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.玻璃纤维结构(GLES20.玻璃纤维结构5);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,mFireTextureHandle);
GLES20.glActiveTexture(GLES20.GL_TEXTURE6);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,mFireNormalHandle);
...
对于(int i=0;i
它将为每个塔显示正确的纹理和法线。在旧款手机上(我的朋友们难以置信),它只显示了所有的塔和最后一种被绘制的纹理。我可以将每个塔的正确纹理换成纹理1,但这不是太慢了吗


有没有人知道为什么它在某些手机上不起作用,以及我需要做什么才能使它在所有兼容OpenGLES20的手机上都兼容?

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

-纹理单元的数量为 依赖于实现,但必须至少有两个

此外,您可能还需要检查
GL\u MAX\u组合的\u纹理\u图像\u单位
(使用
glGet

要调试问题,您可能需要在每次调用
glActiveTexture
/
glBindTexture
之后检查
glGetError
,可能还有那些
glUniform1i