【问题标题】:Drawing transparent ShapeRenderer in libgdx在 libgdx 中绘制透明的 ShapeRenderer
【发布时间】:2013-01-19 23:15:51
【问题描述】:

我使用 ShapeRenderer 绘制了一个实心圆,现在我想将此圆绘制为透明圆。我正在使用以下代码来做到这一点:但圆圈并不透明。另外,我检查了 libgdx API 和 wiki,它说需要创建 CameraStrategy。以前有人遇到过类似的问题吗?如果是这样,请给我一些线索。提前致谢。

 Gdx.gl.glEnable(GL10.GL_BLEND);
      Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
      drawFilledCircle();
      Gdx.gl.glDisable(GL10.GL_BLEND);

private void drawFilledCircle(){

   shapeRenderer.setProjectionMatrix(camera.combined);
   shapeRenderer.begin(ShapeType.FilledCircle);
   shapeRenderer.setColor(new Color(0, 1, 0, 1));
   shapeRenderer.filledCircle(470, 45, 10);
   shapeRenderer.end();

}

【问题讨论】:

  • 如果你不介意我问,你为什么要画一个透明的圆圈?
  • @crynix,基本上我需要了解如何使用 ShapeRenderer 来显示透明度。我不想在这里使用透明纹理。所以我想使用 ShapeRenederer。

标签: java android libgdx


【解决方案1】:

好吧,绘制完全透明的东西并没有什么意义。如果您确实想制作一个半透明的圆圈,则必须在每帧之前通过glClearColor 清除颜色缓冲区并将Color alpha 分量设置为0.5f

如果你不清除缓冲区,在几次渲染绘制之后,圆圈就会混合成一个几乎是纯色的圆圈。

private void drawFilledCircle(Camera camera){
    Gdx.gl.glClearColor(0, 0, 0, 0); 
    Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT  );

    shapeRenderer.setProjectionMatrix(camera.combined);
    shapeRenderer.begin(ShapeType.FilledCircle);
    shapeRenderer.setColor(new Color(0, 1, 0, 0.5f)); // last argument is alpha channel
    shapeRenderer.filledCircle(470, 45, 10);
    shapeRenderer.end();
}

【讨论】:

  • ,在我的情况下,进行了上述更改,我看不到透明度
  • 由于某种原因,颜色中的 alpha 在调试模式下工作(绘制 scene2ui 元素的边框)。但是没有调试模式,我得到了纯色不透明的颜色(当 alpha 为 1f 时结果相同)。我在每一帧之前清除缓冲区。
【解决方案2】:

在这种情况下,以下代码对我有用,也许它会帮助其他人:

Gdx.gl.glEnable(GL10.GL_BLEND);
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeType.FilledCircle);
shapeRenderer.setColor(new Color(0, 1, 0, 0.5f));
shapeRenderer.filledCircle(470, 45, 10);
shapeRenderer.end();
Gdx.gl.glDisable(GL10.GL_BLEND);

【讨论】:

  • 感谢它的工作,但我希望我不会弄乱其他混合材料(如果有的话)
  • 在启用混合之前使用 mySpriteBatch.end() 停止/暂停当前 SpriteBatch 非常重要!否则半透明绘图操作将不起作用! :D
  • 非常感谢,完美运行。如果可以的话,我会多次投票!
  • 注意:您不应该在每一帧上分配新的 Color 实例。
  • 必须将 GL10 更改为 GL20 才能使其正常工作。谢谢!
【解决方案3】:

首先我们需要启用混合:

Gdx.gl.glEnable(GL10.GL_BLEND);

并确保不要在该行代码和Shaperender.drawSomething() 代码行之间调用SpriteBatch.begin()SpriteBatch.end()。我不知道为什么,但这就是我的情况

【讨论】:

  • 对于较新版本的 LibGDX,将 GL10 替换为 GL20
  • 对于较新版本的 LibGDX,将 GL20 替换为 GL30
  • GL30 extends GL20GL30.GL_BLEND 是对 GL20.GL_BLEND 的静态引用。
【解决方案4】:

只有这对我有用:

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);   // <<< this line here makes the magic we're after
game.shapeRenderer.setProjectionMatrix(camera.combined);
game.shapeRenderer.begin(ShapeType.Filled);
    go.drawShapes();
game.shapeRenderer.end();
//Gdx.gl.glDisable(GL20.GL_BLEND);

【讨论】:

  • 同样的事情发生在我身上。 LibGDX 去年某个时候停止了对 OpenGL 版本 1.x 的支持。这可能只是使用较新版本的结果。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多