Bagaimana cara membuat PNG dengan transparansi di LibGDX?


12

Saya sedang membangun contoh tic-tac-toe sederhana dengan LibGDX. Saya memiliki gambar sederhana: lintas, lingkaran, dan papan, semua pngdibuat dengan GIMP dengan latar belakang transparan.

Bagaimana saya dapat menjadikannya sebagai Texturedengan transparansi?

Saya sudah mencoba dengan fitur mengaktifkan GL10, tetapi sepertinya tidak berfungsi.


Sudahkah Anda memasukkan ini ke dalam kode Anda: Gdx.gl.glClearColor (1, 1, 1, 1); Gdx.gl.glClear (GL10.GL_COLOR_BUFFER_BIT);
LeSam

letakkan ini di render loop
LeSam

Seharusnya bekerja dengan baik (tidak untuk saya). Masalah spesifik apa yang Anda alami?
ashes999

Pernyataan Anda: "Saya punya gambar sederhana: salib, lingkaran, dan papan semua png yang dibuat dengan gimp dengan alfa sebagai warna." bisa ditafsirkan banyak cara yang berbeda, dari transparansi warna-kunci untuk pra-dikalikan alpha. Bisakah Anda mengklarifikasi maksud Anda? Secara umum Anda akan membutuhkan alpha blending (transparansi alpha) atau pengujian alpha (alpha mask); tak satu pun dari hal-hal ini diaktifkan secara default dan yang kedua tidak didukung di OpenGL modern.
Andon M. Coleman

Jawaban:



2

Buat Sprite dan tetapkan Tekstur untuknya, Lalu gunakan Sprite setColor untuk menyesuaikan alpha-nya, seperti itu,

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

dan dalam render () loop menggunakan SpriteBatch

sprite.draw(spriteBatch);

Perhatikan bahwa SpriteBatch menggunakan DefaultShader, jika Anda ingin Anda dapat menulis shader Anda sendiri untuk mengontrol transparansi, dan tentu saja Anda harus mengaktifkan OpenGL ES 2.0 untuk itu.
daniel

1

Jika Anda menempatkan

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

di awal loop render () Anda harus menyegarkan layar dengan warna hitam. Jadi jika ada gambar yang memiliki transparansi di dalamnya, itu akan terlihat.

jadi loop render () Anda mungkin terlihat seperti ini

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

Saya mencoba membuat .png dengan transparansi juga. Dengan pengaturan dasar (blending tidak diaktifkan) itu tidak membuat dengan benar.

Saya tidak pernah mengaktifkan blending, tetapi saya menambahkan ini:

Gdx.gl.glClear(GL20.GL_ALPHA_BITS);

Masalah saya adalah alfa tidak pernah dihapus. Berarti jika saya merender dengan 0,1 alpha, itu akan membutuhkan 10 frame sampai alpha "ditumpuk" kembali ke 1. Menambahkan panggilan di atas menghapus alpha, sama seperti Anda akan membersihkan warna.

Saya tahu ini adalah pertanyaan lama, jadi solusinya berbeda. enableBlending harus tetap berfungsi, tetapi saya tidak yakin apakah ini mencegah "penumpukan" alpha. Membersihkan bit alpha mungkin merupakan cara termudah untuk mencegah tampilan yang solid.

Adapun rendering yang sebenarnya, itu sama seperti biasa.

//Viewport, camera, logic, etc
batch.begin();
//draw your image(s) here
batch.end();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.