android opengl 纹理绘制错误的纹理

android opengl texture drawing wrong texture

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

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

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

纹理创建代码

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]加数字显示了另一个纹理,但是新添加的纹理似乎无处可寻。

错了...

  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(纹理单元号)

感谢您的帮助。我想通了一些事情。 我 运行 在手机和平​​板电脑这两种设备上使用它,但都无法正常工作。 我不知道什么是共享上下文组,但感谢提示 Reto Koradi,它很有帮助。

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

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