3

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

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

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

模板测试

所以,基本上,有没有办法让我使用 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);
4

2 回答 2

1

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

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

于 2015-01-07T07:06:51.667 回答
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);

结果: 之前 之后

于 2013-04-28T20:54:05.107 回答