【问题标题】:opengl es 2.0 texture loadingopengl es 2.0 纹理加载
【发布时间】:2012-05-16 10:12:00
【问题描述】:

我正在制作一个 OpenGL ES 2.0 安卓轮播。我有一个“for”函数,它在每次迭代中调用“drawSquares”函数,在圆形中绘制正方形。这是通过在每次绘制新正方形时更改模型矩阵来完成的。 (为了绘制正方形,我使用相同的顶点和片段着色器)

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

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

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

可以提出一些建议,或者告诉我实现这一点的最佳方法。我正在阅读有关 opengl es 2.0 的信息大约两个月了,但仍然补充说有很多我不明白的东西。请帮助,我将非常感谢每一个建议。谢谢你!!!

【问题讨论】:

    标签: android opengl-es textures


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我会尝试上述建议,希望它们能奏效。
    • @eskimo9 你的意思是glActiveTexture 而不是glSetActiveTexture
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2012-04-08
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多