opengl es 2.0纹理加载

时间:2011-12-16 14:24:15

标签: android opengl-es textures

我正在制作一个OpenGL ES 2.0安卓旋转木马。我有一个“for”函数,在每次迭代中都会调用“drawSquares”函数来绘制圆形中的正方形。这是通过每次绘制新方块时更改modelMatrix来完成的。 (为了绘制正方形,我使用相同的顶点和片段着色器)

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

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

但每个方块都有相同的纹理。

有些人可以提出建议吗,或告诉我实施此方法的最佳方法。我现在正在阅读有关opengl es 2.0大约两个月的内容,但仍然认为有很多我不理解的事情。请帮助,我会非常感谢每一个建议。谢谢你!!!

1 个答案:

答案 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. 或两个选项的某种组合 - 即通过预先加载的纹理数组来节省加载时的处理器时间,但您可能需要动态绑定至少其中一些以避免耗尽可用纹理。