0

我正在使用取自“开始 android 游戏”的框架编写一个带有 open gl es 1.0 的 android 游戏。

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

但是发生的事情是,当我绘制纹理时,它会将最先绘制的线条遮盖掉,即使它们离纹理块还很远。

在我的头撞了很长时间之后,我发现如果我切换到没有 Alpha 通道的图像,它可以工作并且不会清除背景。但是,如果我回到具有透明背景的图像,就会出现问题。

这是一张带有一些屏幕截图的图片:http: //imgbox.com/abxDKzSd 顶部是使用不带 alpha 的图像的屏幕,下面是完全一样的,但图像具有透明度。

  • 当活动开始时,我看到线条非常短暂地闪烁,但在那之后就再也没有
  • 我正在启用混合
  • 我的纹理尺寸是 2 的幂(128 x 32)
  • 每次通话后我都会检查 gl 错误,但看不到任何错误
  • 我直接在我的kindle fire 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

谁能帮我弄清楚为什么会这样?我就是无法让它工作!

4

2 回答 2

0

好的!终于想通了

原来我不得不移动

gl.glEnable(GL10.GL_TEXTURE_2D);

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

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

于 2013-03-28T18:13:27.340 回答
0

你需要禁用,GL_DEPTH_TEST否则如果你在比已经存在的东西更高/相等的深度上绘制一些东西,它就不会出现。

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

于 2013-03-23T12:42:34.993 回答