在libgdx中绘制透明的ShapeRenderer

45

我使用ShapeRenderer绘制了一个填充的圆,现在我想将这个圆绘制为透明的。我使用以下代码来实现:但是圆形没有变成透明的。我查看了libgdx API以及维基百科,它说需要创建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();

}

如果您不介意我问一下,为什么您想要绘制一个透明的圆形? - Zach Latta
@crynix,我需要了解如何使用ShapeRenderer来显示透明度。我不想在这里使用透明纹理。因此,我想使用ShapeRenederer来实现。 - UVM
4个回答

102

下面这段代码在我的情况下有效,也许会帮助其他人:

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

1
谢谢,它正在工作,但我希望它不会影响其他混合材料(如果有)。 - PraveenMax
14
在启用混合之前,非常重要的一点是使用mySpriteBatch.end()来停止/暂停当前的SpriteBatch!否则半透明绘图操作将无法正常工作! :D - Christopher Stock
1
非常感谢,完美地运作。如果可以的话,我会投多次赞! - siyb
2
注意:不应在每个帧上分配新的Color实例。 - Miha_x64
2
不得不将 GL10 更改为 GL20 才能使其正常工作。谢谢! - Spikatrix
显示剩余3条评论

13

首先,我们需要启用混合:

Gdx.gl.glEnable(GL10.GL_BLEND);

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


6
针对LibGDX的更新版本,将GL10替换为GL20 - Morgoth
1
针对LibGDX的更新版本,请将GL20替换为GL30 - EntangledLoops
GL30 扩展了 GL20,而 GL30.GL_BLEND 是对 GL20.GL_BLEND 的静态引用。 - dan1st

6

只有这个方法对我有效:

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

1
我也遇到了同样的问题。LibGDX在去年某个时候停止支持OpenGL 1.x版本。这很可能只是使用更新版本的结果。 - Robert Krupp

5

实际上,画透明图形没有什么意义。如果你想要画一个半透明的圆,你需要在每一帧之前使用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();
}

3
针对以上变化,就我的情况而言,我无法看到透明度。 - UVM
由于某种原因,alpha在调试模式下可以正常工作(绘制scene2ui元素的边框)。但是在没有调试模式的情况下,我得到了实心不透明的颜色(当alpha为1f时结果相同)。我在每一帧之前清除缓冲区。 - monnef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接