2011-12-16 207 views
0

我正在制作一个OpenGL ES 2.0 android carousel。我有一个“for”函数,在每次迭代中都会调用“drawSquares”函数来绘制圆圈中的正方形。每当一个新的方块被绘制时,通过改变模型矩阵来完成。 (用于绘制正方形我使用相同的顶点和片段着色器)opengl es 2.0纹理加载

我需要在正方形上应用纹理,但是每个正方形都要有不同的纹理。我似乎无法做到这一点。我试图在调用drawSquare之前更改纹理数据的句柄值。

mTextureDataHandle = TextureHelper.loadTexture(context, item.getTexture()); 

但是每个正方形都具有相同的纹理。

有些人可以提出一些建议,或者告诉我实施这个的最好方法。我现在正在阅读关于opengl es 2.0的书,现在大约两个月了,但是仍然有很多我不明白的东西。请帮助,我会深深地感谢每一个建议。谢谢你!!!

回答

2

开始Here。你有两个选择 -

  1. glBindTexture - 每次加载一个新的纹理到您的处理时间,你将不得不再次绑定它
  2. 使用句柄的数组 - 你可以设置mTextureDataHandle了作为INT [],填补它,然后绑定每个纹理到一个单独的GL纹理:

    mTextureDataHandle[0] = ...; //Load textures - repeat for [1..N] 
    /* 
    * Select which GL texture spot to use - GL has 30 pointers to use, your device 
    * likely won't support that many 
    */ 
    GLES20.glSetActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GL_TEXTURE_2D, mTextureDataHandle[0]); 
    
    GLES20.glSetActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.gBindTexture(GL_TEXTURE_2D, mTextureDataHandle[1]); 
    
    //To draw with the right texture select which GL texture to point to (index): 
    GLES20.glUniform1i(mtextureUniformHandle, index); 
    drawStuff(); 
    

    您将在这里通过设备所支持的纹理的数量限制 - 使用

    IntBuffer max = IntBuffer.allocate(1); 
    GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_IMAGE_UNITS, max); 
    Log.d("tag","Texture units: " + max.get()); 
    
  3. 或者两个选项的某种组合 - 即通过预加载纹理数组来减少加载处理器的时间,但您可能需要动态绑定至少一些选项以避免用尽可用纹理。

+0

谢谢你的回复。我会尝试上述建议,并希望他们能够工作。 – Sandra 2012-05-16 08:19:54