Bagaimana saya bisa mencapai efek api yang baik dengan alpha blending dan partikel?

41

Menggunakan pengaturan berikut untuk efek partikel OpenGL:

SRC: GL_SRC_ALPHA
DST: GL_ONE

Menciptakan campuran aditif, yang terlihat spektakuler pada latar belakang hitam tetapi mengerikan pada warna yang lebih cerah, karena memudar menjadi putih.

Saya kemudian menggunakan alpha blending:

SRC: GL_SRC_ALPHA
DST: GL_ONE_MINUS_SRC_ALPHA

Hal ini memungkinkan latar belakang lain untuk digunakan tanpa mempengaruhi warna partikel, tetapi partikel itu sendiri terlihat kusam dibandingkan dengan campuran aditif. Bagaimana saya bisa mencapai efek api yang baik dengan alpha blending dan partikel?

Aditif:

Aditif pada warna hitam Aditif berwarna biru

Alfa:

Alpha hitam Alpha berwarna biru

MEMPERBARUI:

Mengikuti saran David di bawah ini, saya membuat tekstur terpisah dan kemudian menggunakan campuran aditif pada efek partikel sebelum menggambar ke tekstur. Masalahnya adalah bahwa menggambar pada tekstur alpha = 0 hanya menghasilkan bagian berwarna dari partikel yang muncul di depan peta dunia saya, karena biasanya Anda memiliki latar belakang hitam. Caranya adalah dengan menggunakan dua tekstur. Saya menciptakan tekstur hitam dan kemudian menggambar partikel di atasnya. Lalu saya menghapus lapisan alfa partikel dari tekstur ini, secara efektif menghilangkan semua hitam pekat di sekitarnya dan memudar sebagian partikel yang terlihat, sambil meninggalkan hitam yang mendasarinya seperti yang Anda harapkan saat membuat partikel campuran aditif pada latar belakang hitam. Singkatnya, proses yang melelahkan, tetapi saya akhirnya sampai di sana:

Aditif reguler dan versi saya

Inilah utas tempat saya memposting proses saya: http://www.cocos2d-iphone.org/forum/topic/28707?replies=8#post-141528

Video: http://www.youtube.com/watch?v=JptGbEO3b5E

Aram Kocharyan
sumber

Jawaban:

17

Saya akui saya tidak mengetahui adanya solusi ideal untuk masalah ini, jadi saya akan jelaskan solusi yang mungkin membuat Anda nyaman atau tidak nyaman:

  1. Jadikan semua partikel menggunakan campuran aditif ke tekstur yang terpisah (atau render target) dengan latar belakangnya dibersihkan hingga transparan .
  2. Render tekstur itu (atau render target) di atas adegan Anda menggunakan alpha blending .

Saya mencobanya di Photoshop dan inilah yang saya dapatkan - Ini tidak sempurna, tapi setidaknya itu mempertahankan warna asli lebih baik:

masukkan deskripsi gambar di sini

Inilah tekstur asli tanpa melakukan campuran aditif pada partikel:

masukkan deskripsi gambar di sini

David Gouveia
sumber
Apakah ini akan memisahkan mereka menjadi dua tekstur dan menjadi seolah-olah saya memiliki tekstur campuran aditif yang ditarik ke latar belakang?
Aram Kocharyan
@AramKocharyan Saya sebenarnya belum mencobanya secara pribadi selain di Photoshop di mana hasilnya tampak masuk akal. Tapi saya pikir itu harus terlihat seperti gambar pertama Anda tetapi dengan semua kulit hitam digantikan oleh warna latar belakang Anda. Dengan kata lain, partikel-partikel tersebut ditambahkan bersama-sama sehingga menghasilkan sorotan besar di tengah ledakan, tetapi tidak dengan latar belakang. Kemudian ledakan yang dihasilkan ditempel di atas latar belakang Anda tanpa menambahkan yang mempertahankan tampilan asli.
David Gouveia
Terima kasih itu masuk akal, itu hanya seperti campuran normal di Photoshop vs overlay, tetapi tampak seperti gambar overlay yang duduk di atas lapisan latar belakang. Saya akan mencobanya dan memberi tahu Anda.
Aram Kocharyan
@AramKocharyan saya akan memposting hasil yang saya dapatkan di photoshop dalam beberapa menit sehingga Anda dapat membandingkan.
David Gouveia
5
Hanya melempar ini ke luar sana - teknik ini mungkin meningkatkan kekhawatiran kinerja ...
not not
4

Seperti yang ditunjukkan David Gouveia, tidak ada pengganti yang memuaskan untuk campuran aditif pada latar belakang yang cerah. Efek terbaik yang saya temukan (yang tidak memerlukan sesuatu seperti rendering ke backbuffer) adalah menggunakan metode GL GLM berikut:

SRC: GL_ONE
DST: GL_ONE_MINUS_SRC_ALPHA

Ini tidak sebagus campuran aditif, tetapi jauh lebih baik daripada GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. Jika Anda sedikit mengubah nilai alfa awal dan akhir, Anda mungkin mendapatkan hasil yang benar-benar dekat dengan campuran aditif.

mode pencampuran partikel

Pada gambar di atas ada GL_SRC_ALPHA, GL_ONEdi sebelah kiri, di tengah ada GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHAdan di sebelah kanan Anda dapat melihat mode campuran saya akan mengusulkan untuk pengaturan ini.

bummzack
sumber
Saya setuju bahwa untuk kontrol total atas warna, metode ini sangat bagus.
Aram Kocharyan
Sebagai catatan, saya perhatikan bahwa dengan metode ini cara terbaik untuk memadamkan api adalah membuatnya menjadi ukuran nol, karena berkurangnya alfa menyebabkannya memudar menjadi putih.
Aram Kocharyan
3

Sudahkah Anda mencoba menggunakan keduanya? Lapisi beberapa partikel dengan alpha blending, yang akan membuat warna Anda seperti yang Anda inginkan, lalu kembali dengan beberapa campuran aditif untuk mendapatkan highlight yang bagus yang Anda cari.

notlesh
sumber
Itu mungkin pilihan saya berikutnya, saya ingin menjaga partikel tetap minimum. Semoga aku bisa setengah dari keduanya.
Aram Kocharyan
3

Pertama-tama, gambar partikel yang Anda gunakan tampaknya memiliki latar belakang hitam, menghasilkan pinggiran gelap pada gambar kedua. Jangan lakukan itu; yaitu, jangan menggambar bentuk partikel pada saluran warna. Sebagai gantinya, gambar harus berwarna solid dan hanya menentukan bentuk di saluran alfa.

Melakukan hal itu akan meningkatkan tampilan transparansi alfa secara signifikan. Kemudian Anda dapat lebih meningkatkan tampilan efek keseluruhan dengan membuat partikel berubah warna sepanjang hidup mereka. Seperti, gambar dasar sangat cerah, memberi Anda area kuning tengah yang terang itu. Kemudian rona partikel oranye kemerahan dan menambah rona seiring waktu. Dengan begitu partikel-partikel akan menjadi gelap ketika mereka bergerak keluar dari pusat.

jhocking
sumber
Ya teksturnya hanya sikat berwarna putih dengan alfa yang bervariasi dari tengah.
Aram Kocharyan
ya, jika itu benar maka aneh bagi saya bahwa tangkapan layar transparansi alpha Anda memiliki lingkaran cahaya gelap di sekitar partikel.
jhocking
Ya, saya tidak yakin mengapa mereka terbentuk di sekitar alpha blending. Tetapi untuk apa yang saya miliki sekarang, tampaknya baik-baik saja.
Aram Kocharyan
Lihat youtube.com/watch?v=JptGbEO3b5E
Aram Kocharyan
Itu terlihat cukup bagus, Anda harus memasukkannya ke dalam pembaruan pertanyaan Anda.
jhocking