2012-02-20 16 views
2

最初に私はOpenGLを初めて使いましたが、私の電話(Motorola 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); 
} 

タワーごとに正しいテクスチャとノーマルが表示されます。古い携帯電話(私の友人Incredible)では、最後のタイプのテクスチャが描かれたタワーのすべてが表示されます。私は各タワーのテクスチャ1に正しいテクスチャを入れ替えることができますが、それほど遅くはないのですか?

一部の携帯電話では動作しない理由と、すべてのOpenGLES20互換携帯電話で互換性を持たせるために必要な情報はありますか?

ドキュメントが言うようにあなたはおそらく、例えば、最大のアクティブなテクスチャのいくつかの制限に達している

答えて

3

glActivateTexture - テクスチャユニットの数は、依存 実装ですが、少なくとも2

でなければなりません

GL_MAX_COMBINED_TEXTURE_IMAGE_UNITSglGet)もチェックしてください。

デバッグの問題には、各コールglActiveTexture/glBindTextureと、おそらくそれらのglUniform1iglGetErrorをチェックすることをお勧めします。