【问题标题】:android opengl texture drawing wrong textureandroid opengl纹理绘制错误的纹理
【发布时间】:2015-08-07 21:46:24
【问题描述】:

我有一个绘图线程和一个单独的事件线程。当渲染器启动时,我可以毫无问题地创建任意数量的纹理。但是当我尝试在单独的线程中添加新纹理时,纹理会变成另一个纹理。假设我在启动时创建了 tex1、tex2 和 tex3,并且我想动态添加 tex4,tex4 将看起来像 tex1,但有自己的尺寸(tex1 拉伸到 tex4 大小)。如果我添加更多纹理,它们将看起来像以前的纹理。 tex5 看起来像 tex2 和 tex6 像 tex3。

这甚至可以,因为我可以移动一些东西,但是在所有预加载的纹理都“用完”之后,新的纹理将是白色的。

所以简而言之,在启动时我可以添加任何纹理,但是添加的纹理是在开始时按顺序加载的,然后是空白。

纹理创建代码

gl.glGenTextures(1, texture_handler, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture_handler[0]);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    ByteBuffer tbb = ByteBuffer.allocateDirect(uvs.length * 4);
    tbb.order(ByteOrder.nativeOrder());
    textureBuffer = tbb.asShortBuffer();
    textureBuffer.put(uvs);
    textureBuffer.position(0);

以及绘图代码

Utils.gl.glLoadIdentity();
    Utils.gl.glTranslatef(x, y, 0);
    Utils.gl.glScalef(width, height, 1);
    Utils.gl.glBindTexture(GL10.GL_TEXTURE_2D, textImage[0]);
    Utils.gl.glVertexPointer(3, GL10.GL_SHORT, 0, vertexBuffer);
    Utils.gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, textureBuffer);
    Utils.gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

textImage[0]+1一样给textImage[0]添加数字会显示另一个纹理,但似乎找不到新添加的纹理。

【问题讨论】:

  • 你在什么设备上运行?
  • 您为两个线程创建了单独的上下文,并且上下文位于同一个共享组中?

标签: java android opengl-es textures


【解决方案1】:

这是错误的......

  1. 你永远不会绑定你生成的。

    gl.glGenTextures(1, texture_handler, 0); //texture_handler 应该是 texture_handler[0] gl.glBindTexture(GL10.GL_TEXTURE_2D, texture_handler[0]);

    Utils.gl.glBindTexture(GL10.GL_TEXTURE_2D, textImage[0]); // texImage[0] 来自哪里?一定是你生成的 glGenTextures(1, ttexImage[0]);

  2. 如果你有多个纹理,你应该在绑定一个纹理之前调用 glactivetexture(texture unit number)

【讨论】:

    【解决方案2】:

    感谢您的帮助。我想通了一些东西。 我在两台设备上运行它,一部电话和一台平板电脑,但都无法正常工作。 我不知道什么是共享上下文组,但感谢Reto Koradi 的提示,它有所帮助。

    至于我做错了什么,我不太了解他们。我以为我用 glBindTexture 绑定了我的纹理。如果我将 texture_handler[0] 放在 glGenTextures() 中,它会给我一个错误,因为它需要 int[]。 glactivetexture 变化不大,所以没用。

    现在可以了,我是这样解决的: 我不在单独的线程中执行绑定脚本,我只是将一个变量设置为 1,然后在渲染器的 onDraw 中检查变量,并将其绑定到该线程中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多