【问题标题】:LibGDX Stencil Buffers while using SpriteBatch使用 SpriteBatch 时的 LibGDX 模板缓冲区
【发布时间】:2013-04-08 02:22:47
【问题描述】:

这是我之前的问题和帖子的延续,见 here。感谢我在那里收到的答案,我觉得我能够更接近我的目标,以及进一步学习 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);

【问题讨论】:

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


    【解决方案1】:

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

    TL;DR 使用“if(gl_FragColor.a

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 您的结果与我所追求的非常吻合,但示例中似乎缺少某些内容。使用上面的代码似乎根本没有改变你在分层透明精灵时通常得到的显示(类似于你的“之前”图像)。我也以不同的方式修改了深度测试,试图解决这个问题,但我似乎无法找出我缺少什么让它工作,即使是一个简单的设置,除了两个精灵什么都不做。最起码,谢谢你让我知道这样可以达到效果。
      • 可能你没有设置这个 Gdx.gl.glClearColor(0.9f, 0.9f, 0.9f, 1); - 在我的情况下用灰色填充背景。我仅在绘制没有“重叠”的圆圈时才使用深度测试。 SpriteBatch 在没有 DEPTH_TEST 的情况下绘制的正方形和其他对象。或者您可以将您的代码发送到这里或发送给我。
      • 抱歉耽搁了,最近太忙了!目前我正在使用一个简单的测试项目来尝试解决这个问题,上面我发布了当我执行您之前发布的内容时相当于我的整个渲染方法的内容,但结果只是两个重叠的圆圈,类似于您的“之前“ 图片。基本上,像这样简单地启用深度测试似乎根本不会改变它的绘制方式,所以我认为我在两者之间缺少一些关键的设置线,但尽管我一直在尝试它,但我找不到什么我失踪了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2012-03-13
      • 1970-01-01
      • 2012-07-08
      • 2011-09-05
      相关资源
      最近更新 更多