2012-02-20 107 views
2

首先,我是OpenGL的新手,但在我的手机(摩托罗拉Bionic)中,以下代码按预期工作。Android OpenGL ES2.0纹理交换

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

它会显示正确的纹理和正常的每个塔。在旧手机上(我的朋友不可思议),它只显示所有绘制最后类型纹理的塔。我可以将正确的纹理交换到每个塔的纹理1,但是速度并没有那么慢,并且看起来很低调?

有没有人有任何信息说明为什么它不能在某些手机上工作,以及为了使其兼容所有兼容OpenGLES20的手机,我需要做些什么?

回答

3

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

glActivateTexture - 纹理单元的数量是 实现相关,但必须至少有两个

你也可以检查GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS(与glGet)。

要调试的问题,您可能希望每个呼叫glActiveTexture/glBindTexture也许那些glUniform1i后检查glGetError