Come si esegue il rendering di un file PNG con trasparenza in LibGDX?


12

Sto costruendo un semplice esempio di tic-tac-toe con LibGDX. Ho immagini semplici: croce, cerchio e tavola, tutte pngcreate con GIMP con uno sfondo trasparente.

Come posso renderli come Texturecon trasparenza?

Ho provato con la funzione di abilitazione GL10, ma sembra non funzionare.


Hai inserito questo nel tuo codice: Gdx.gl.glClearColor (1, 1, 1, 1); Gdx.gl.glClear (GL10.GL_COLOR_BUFFER_BIT);
LeSam,

inseriscilo nel ciclo di rendering
LeSam il

Dovrebbe funzionare bene (fa per me). In quale specifico problema ti sei imbattuto?
ashes999,

La tua affermazione: "Ho immagini semplici: incrocia, cerchia e imbarca tutti i png creati con gimp con alfa come colore". potrebbe essere interpretato in molti modi diversi, dalla trasparenza dei tasti colorati all'alfa pre-moltiplicata. Puoi chiarire cosa intendi? Generalmente avrai bisogno di miscelazione alfa (trasparenza alfa) o test alfa (maschera alfa); nessuna di queste cose è abilitata di default e la seconda non è supportata nel moderno OpenGL.
Andon M. Coleman,

Risposte:



2

Crea Sprite e assegna Texture ad esso, quindi usa Sprite setColor per regolare l'alfa, in questo modo,

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

e nel ciclo render () usa SpriteBatch

sprite.draw(spriteBatch);

Nota che SpriteBatch usa DefaultShader, se desideri scrivere il tuo shader per controllare la trasparenza, e ovviamente dovresti abilitare OpenGL ES 2.0 per questo.
Daniel

1

Se metti

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

all'inizio del ciclo render () è necessario aggiornare lo schermo con il colore nero. Quindi, se qualche immagine presenta trasparenza, sarà evidente.

quindi il tuo loop render () potrebbe apparire così

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

Ho provato a rendere un .png anche con trasparenza. Con l'impostazione di base (fusione non attivata), il rendering non è stato eseguito correttamente.

Non ho mai attivato la fusione, ma ho aggiunto questo:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

Il mio problema era che l'alfa non era mai stata risolta. Significa che se avessi eseguito il rendering con 0,1 alfa, sarebbero necessari 10 fotogrammi prima che l'alfa fosse "impilata" di nuovo su 1. L'aggiunta della chiamata sopra cancellava l'alfa, proprio come si cancellerebbe il colore.

So che questa è una vecchia domanda, quindi le soluzioni erano diverse. enableBlending dovrebbe ancora funzionare, ma non sono sicuro che ciò impedisca lo "stacking" di alpha. La cancellazione dei bit alfa è probabilmente il modo più semplice per impedire l'aspetto solido.

Per quanto riguarda il rendering effettivo, è lo stesso di sempre.

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.