如何在LibGDX中渲染具有透明性的PNG?


12

我正在用LibGDX构建一个简单的井字游戏示例。我有简单的图像:十字,圆圈和木板,所有这些都是png使用GIMP在透明背景下创建的。

如何使它们呈现为Texture具有透明度?

我已经尝试使用GL10启用功能,但似乎无法正常工作。


您是否将其放入代码中:Gdx.gl.glClearColor(1,1,1,1); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
LeSam 2013年

将其放入渲染循环中
LeSam 2013年

它应该工作正常(对我来说有用)。您遇到了什么具体问题?
ashes999

您的陈述是:“我有简单的图像:将用gimp的gimp创建的所有png交叉,画圆和上色。” 可以用多种不同的方式来解释,从颜色键透明度到预乘alpha。您能说明您的意思吗?通常,您将需要alpha混合(alpha透明度)或alpha测试(alpha遮罩);这些功能默认情况下均未启用,现代OpenGL不支持第二种功能。
Andon M. Coleman

Answers:



2

创建Sprite并为其分配Texture,然后使用Sprite setColor调整其Alpha,就像这样,

Texture yourTexture = new Texture("image.png");
sprite = new Sprite(yourTexture);
//RGBA
sprite.setColor(1, 0, 0, 0.2f);

并在render()循环中使用SpriteBatch

sprite.draw(spriteBatch);

请注意,SpriteBatch使用DefaultShader,如果您希望编写自己的着色器以控制透明度,则当然应该为此启用OpenGL ES 2.0。
丹尼尔(Daniel)2013年

1

如果你把

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

在render()循环的开始处应使用黑色刷新屏幕。因此,如果任何图像具有透明性,则将非常明显。

所以您的render()循环可能看起来像这样

public void render(float delta) {
  Gdx.gl.glClearColor(0, 0, 0, 1);
  Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

  // Update logic & etc.        

  batch.begin();

  // Place your render calls
  // In this I use a Sprite object named "sprite" and all you need to do is call .draw();
  // on it and it will render at 0,0, unless told differently with .setPosition();

  sprite.draw(batch);

  batch.end();              
}

0

我也尝试渲染具有透明度的.png文件。使用基本设置(未激活混合)时,渲染不正确。

我从未激活过混合功能,但确实添加了以下内容:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

我的问题是Alpha从未清除。这意味着,如果我使用0.1 Alpha进行渲染,则将需要10帧,直到Alpha被“堆叠”回至1。添加上面的调用将清除Alpha,就像清除颜色一样。

我知道这是一个老问题,因此解决方案便有所不同。enableBlending应该仍然可以工作,但是我不确定这是否会阻止alpha的“堆栈”。清除Alpha位可能是防止整体外观最简单的方法。

至于实际渲染,则与往常一样。

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.