Como renderizo um PNG com transparência no LibGDX?

12

Estou construindo um exemplo simples de jogo da velha com o LibGDX. Tenho imagens simples: cruz, círculo e quadro, todos pngcriados com o GIMP com um fundo transparente.

Como posso renderizá-los Texturecom transparência?

Eu tentei com o recurso de ativação do GL10, mas parece não funcionar.

Vokail
fonte
Você colocou isso no seu código: Gdx.gl.glClearColor (1, 1, 1, 1); Gdx.gl.glClear (GL10.GL_COLOR_BUFFER_BIT);
LeSam
coloque isso no loop de renderização
LeSam
Deve funcionar bem (funciona para mim). Em que problema específico você se deparou?
ashes999
Sua declaração: "Tenho imagens simples: cruze, circule e embarque todos os pngs criados com o gimp com alfa como cor". pode ser interpretado de várias maneiras diferentes, desde a transparência das teclas de cores até o alfa pré-multiplicado. Você pode esclarecer o que quer dizer? Geralmente você vai precisar de mistura alfa (transparência alfa) ou teste alfa (máscara alfa); nenhuma dessas coisas é ativada por padrão e a segunda não é suportada no OpenGL moderno.
Andon M. Coleman

Respostas:

2

Crie Sprite e atribua Texture a ele. Em seguida, use Sprite setColor para ajustar seu alfa, assim,

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

e no loop render () use SpriteBatch

sprite.draw(spriteBatch);
daniel
fonte
Observe que o SpriteBatch usa o DefaultShader, se você quiser escrever seu próprio sombreador para controlar a transparência e, é claro, você deve habilitar o OpenGL ES 2.0 para isso.
Daniel
1

Se você colocar

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

no início do seu loop render () deve atualizar a tela com a cor preta. Portanto, se alguma imagem tiver transparência, será perceptível.

então seu loop render () possivelmente se pareceria com este

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();              
}
CNIAngel
fonte
0

Tentei renderizar um .png com transparência também. Com a configuração básica (mistura não ativada), ela não foi renderizada corretamente.

Eu nunca ativei a mistura, mas adicionei o seguinte:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

Meu problema foi que o alfa nunca foi resolvido. Ou seja, se eu renderizei com 0,1 alfa, levaria 10 quadros até que o alfa fosse "empilhado" de volta para 1. A adição da chamada acima limpou o alfa, assim como você limparia a cor.

Sei que essa é uma pergunta antiga, então as soluções eram diferentes. enableBlending ainda deve funcionar, mas não tenho certeza se isso impede o "empilhamento" de alfa. Limpar os bits alfa é provavelmente a maneira mais fácil de impedir a aparência sólida.

Quanto à renderização real, é a mesma de sempre.

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();

fonte