LibGDX Stencil在使用SpriteBatch时缓冲

时间:2013-04-15 20:29:34

标签: java opengl-es libgdx sprite stencil-buffer

这是我之前的问题和帖子的延续,见here。感谢我在那里收到的答案,我觉得我能够更接近我的目标,以及进一步学习OpenGL,但在弄清楚使用模板缓冲区的基础知识后不久,我遇到了一个问题

似乎当我向模板缓冲区绘制一个精灵时,它会绘制整个方形区域,而不是像我无知的那样只是不完全透明的像素。我模糊地理解为什么会这样,但我不确定解决方案在哪里。我已经对模板本身进行了相当多的实验,并且我修改了spritebatch用来丢弃低alpha片段的着色器,但我似乎没有看到更大的图片。

作为问题的一个直观例子,我将继续我在上一个问题中使用的例子。现在,试图在彼此之间绘制两个圆圈(所以它们完美融合,没有重叠),我得到了这个:

Stencil testing

所以,基本上,有没有办法让我在复杂的形状上使用LibGDX的Sprite和SpriteBatch功能来使用模板缓冲区(圆圈仅用作示例),或者我是否需要寻找替代路线?

编辑::

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
    Gdx.gl.glDepthMask(true);

    batch.begin();
    sprite.draw(batch);
    sprite2.draw(batch);
    batch.end();

    Gdx.gl.glDisable(GL20.GL_DEPTH_TEST);

2 个答案:

答案 0 :(得分:0)

Mby这有帮助。 我用混合和深度测试解决了同样的问题。 首先,你需要清晰的深度和颜色位。

Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

然后你需要启用一些gl功能:

Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
Gdx.gl.glDepthMask(true);

之后,您可以绘制对象。在我的项目smtng像这样:

shapeRenderer.setColor(c.getR(), c.getG(), c.getB(), FIELD_ALPHA);
shapeRenderer.filledCircle(p.getPos().x + s.getOffset().x, ApplicationEnv.SCREEN_HEIGHT - p.getPos().y + s.getOffset().x, b.getRadius());

重要!在绘制之后,为spriteBatch(或其他)调用end()并禁用depth_test功能:

Gdx.gl.glDisable(GL10.GL_DEPTH_TEST);

结果: Before After

答案 1 :(得分:0)

模板写入/测试发生在片段级别。当您绘制圆形时,实际上是在绘制四边形碎片,其中每个碎片可能会或可能不会被纹理化。问题在于GPU在对片段进行模板测试时不关心你写入片段的颜色。因此,您需要丢弃片段以停止四边形部分的模板写入,而不想写入模板值。

TL; DR使用“if(gl_FragColor.a< 0.01)discard;”在片段着色器中确保生成一个片段(和模板值)。