Jak renderować pliki PNG z przezroczystością w LibGDX?


12

Buduję prosty przykład kółko i krzyżyk z LibGDX. Mam proste obrazy: krzyż, okrąg i planszę, wszystkie pngstworzone za pomocą GIMP-a z przezroczystym tłem.

Jak mogę je renderować jako Textureprzezroczyste?

Próbowałem z funkcją włączania GL10, ale wydaje się, że nie działa.


Czy umieściłeś to w swoim kodzie: Gdx.gl.glClearColor (1, 1, 1, 1); Gdx.gl.glClear (GL10.GL_COLOR_BUFFER_BIT);
LeSam,

umieść to w pętli renderowania
LeSam

Powinien działać dobrze (robi to dla mnie). Na jaki konkretny problem wpadłeś?
ashes999

Twoje stwierdzenie: „Mam proste obrazy: krzyż, koło i deskę wszystkie pngs utworzone przy pomocy gimp z alfą w kolorze”. można je interpretować na wiele różnych sposobów, od przezroczystości kolorów do wstępnie pomnożonej litery alfa. Czy możesz wyjaśnić, co masz na myśli? Zasadniczo będziesz potrzebował mieszania alfa (przezroczystość alfa) lub testowania alfa (maska ​​alfa); żadna z tych rzeczy nie jest domyślnie włączona, a druga nie jest obsługiwana we współczesnym OpenGL.
Andon M. Coleman,

Odpowiedzi:



2

Utwórz Sprite i przypisz do niego Teksturę, a następnie użyj Sprite setColor, aby dostosować jego alfa, tak jak

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

aw pętli render () użyj SpriteBatch

sprite.draw(spriteBatch);

Zauważ, że SpriteBatch używa DefaultShadera, jeśli chcesz napisać własny moduł cieniujący do kontrolowania przezroczystości, i oczywiście powinieneś w tym celu włączyć OpenGL ES 2.0.
Daniel

1

Jeśli umieścisz

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

na początku pętli render () należy odświeżyć ekran kolorem czarnym. Więc jeśli jakiekolwiek obrazy mają przezroczystość, będzie to zauważalne.

więc pętla render () prawdopodobnie wyglądałaby tak

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

Próbowałem też renderować plik .png z przezroczystością. Przy podstawowej konfiguracji (mieszanie nie zostało aktywowane) nie renderowało się poprawnie.

Nigdy nie aktywowałem mieszania, ale dodałem to:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

Mój problem polegał na tym, że alfa nigdy nie zostało usunięte. Oznacza to, że gdybym renderował z 0.1 alfa, zajęłoby 10 ramek, zanim alfa zostałoby „ułożone” z powrotem do 1. Dodanie powyższego wywołania wyczyściło alfa, tak jak wyczyściłbyś kolor.

Wiem, że to stare pytanie, więc rozwiązania były wtedy inne. enableBlending powinien nadal działać, ale nie jestem pewien, czy to zapobiega „układaniu” alfy. Czyszczenie bitów alfa jest prawdopodobnie najłatwiejszym sposobem, aby zapobiec jednolitemu wyglądowi.

Co do faktycznego renderowania, to jest tak samo jak zawsze.

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.