2012-02-20 111 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