打开GL ES - 纹理与alpha清除背景

时间:2013-03-23 00:48:29

标签: android opengl-es

我正在使用从“开始安卓游戏”中获取的框架编写一个开放gl 1.0的安卓游戏。

我正在尝试使用线条绘制一些线条,然后是纹理多边形。

但正在发生的是,当我绘制纹理时,它会将首先绘制的线条消隐,即使它们不在纹理块附近。

在长时间撞击它之后,我发现如果我切换到没有alpha通道的图像,它会工作并且不会清除背景。但如果我以透明背景返回我的图像,则会出现问题。

这是一张带有屏幕截图的图片:http://imgbox.com/abxDKzSd 顶部的一个显示屏幕使用没有alpha的图像,下面的图像完全相同但图像有透明度。

  • 我看到活动开始时线条会非常短暂地闪烁,但从那以后就不会闪现
  • 我正在启用混合
  • 我的纹理尺寸是2(128 x 32)
  • 的幂
  • 我在每次通话后检查了gl错误,但没有看到任何
  • 我直接在我的点火HD上运行它,模拟器似乎根本无法使用它。

这是代码的片段,我正在渲染我的基元,然后是我的纹理块:

GL10 gl = glGraphics.getGL();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glEnable(GL10.GL_TEXTURE_2D);

m_guiCam.setViewportAndMatrices();

// draw the lines
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glLineWidth(15.0f);

m_vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, m_vertices);
gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, m_numVerts);

// draw textures
m_guiCam.setViewportAndMatrices();
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

m_batcher.beginBatch(Assets.mfTex);
TextureRegion keyFrame = Assets.mfAnim.getKeyFrame(0.0f, Animation.ANIMATION_LOOPING);
m_batcher.drawSprite(250, 250, 32, 32, keyFrame);
m_batcher.endBatch();

gl.glDisable(GL10.GL_BLEND);

我已经制作了一个我能管理的最小的例子,它仍然存在问题,可以在这里找到:https://docs.google.com/folder/d/0Bz7e5tdnz97Id21XZkJoQ005NlU/edit?usp=sharing

任何人都可以帮我弄清楚它为什么会这样做吗?我无法让它发挥作用!

2 个答案:

答案 0 :(得分:0)

你需要禁用GL_DEPTH_TEST否则如果你绘制的东西的深度/深度已经超过已存在的东西,它就不会显示出来。

因此,在您的情况下,请在启用混合的位置添加gl.glDisable(GL10.GL_DEPTH_TEST)(并在不混合时再次启用)。
您可能还需要在绘图开头清除深度缓冲区:gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT)

答案 1 :(得分:0)

确定!终于想通了

原来我必须移动

gl.glEnable(GL10.GL_TEXTURE_2D);

在之后调用来渲染我的线条。我在启用混合后就把它放了。 在绘制纹理精灵后,我还必须禁用纹理。因为否则纹理化仍然会在它回来时再次在下一帧渲染我的线时启用。

所以关于启用纹理的东西足以破坏线条画。 钝!