44

我使用 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();

}
4

4 回答 4

98

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

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);
于 2013-02-06T04:28:14.623 回答
12

首先我们需要启用混合:

Gdx.gl.glEnable(GL10.GL_BLEND);

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

于 2014-03-06T02:44:09.213 回答
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);
于 2014-11-21T09:49:46.163 回答
5

好吧,绘制完全透明的东西并没有什么意义。如果您确实想制作一个半透明的圆圈,则必须glClearColor在每帧之前清除颜色缓冲区并将Coloralpha 分量设置为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();
}
于 2013-02-05T09:01:40.517 回答