android opengl纹理绘制错误纹理

时间:2015-08-06 22:06:02

标签: java android opengl-es textures

我有一个绘图线程和一个单独的事件线程。渲染器启动时,我可以创建任意数量的纹理,没有任何问题。但是当我尝试在单独的线程中添加新纹理时,纹理将成为另一个纹理。假如我在启动时创建了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]添加数字textImage[0]+1会显示另一个纹理,但似乎无法找到新添加的纹理。

2 个答案:

答案 0 :(得分: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(纹理单元号)

答案 1 :(得分:0)

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

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

它现在有效,这是我解决它的方式: 我不在单独的线程中执行绑定脚本,我只是将变量设置为1,并在渲染器的onDraw中检查变量,并将其绑定在该线程中。