LibGDX Stencil在使用SpriteBatch时缓冲

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

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

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

模板测试

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

编辑::

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); 

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

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

然后你需要启用一些glfunction:

 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_testfunction:

 Gdx.gl.glDisable(GL10.GL_DEPTH_TEST); 

结果: 之前

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

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