【发布时间】: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