Saya mencari cara tercepat untuk membuat efek partikel yang sangat sederhana yang akan di-spammed di game ...
Pada dasarnya, gim saya terlihat seperti gim vectrex, sebagian besar terdiri dari baris ... Saya ingin membuat beberapa ledakan kecil yang akan sangat umum.
Ada sesuatu yang lebih cepat daripada hanya bergerak di beberapa titik dan merender dengan GL_Point?
graphics
opengl
graphics-programming
lebih cepat
sumber
sumber
Jawaban:
Benar-benar tidak perlu menyimpan memori untuk setiap partikel dan menghidupkan setiap partikel secara terpisah. Anda dapat melakukannya secara prosedural dengan merekonstruksi posisi partikel selama menggambar dengan menggunakan persamaan fisika klasik. s = ut + 1 / 2.at ^ 2
Contoh sederhana (tanpa percepatan partikel konstan):
Maka Anda cukup meningkatkan s.timeElapsed pada setiap iterasi dari loop pembaruan Anda.
Hal ini juga sepenuhnya dapat diterapkan pada GPU sehingga membebaskan CPU Anda dari keharusan melakukan pekerjaan apa pun. Implementasi GPU mungkin terlihat seperti ini:
Vertikal shader GPU kemudian akan merekonstruksi posisi partikel melalui persamaan fisika dan seragam / konstanta diteruskan ke sana - sama seperti versi CPU.
Untuk menambahkan beberapa variasi, Anda dapat menggunakan ledakan lebih simultan dengan parameter yang sedikit berbeda, menganimasikan warna / alfa, memilih posisi awal yang berbeda. dll.
sumber
Saya membuat beberapa tes, dan cara TERCEPAT (bukan yang tercepat untuk kode) adalah partikel yang terbuat dari GL_LINEs yang tahu posisi dan kecepatan mereka, dan menggunakannya sebagai titik saat merender (jadi, semakin cepat partikelnya berjalan, paling "garis") itu menjadi, semakin lambat, itu menjadi sebuah poin).
Efeknya BENAR-BENAR keren (lihat video perang geometri untuk melihatnya), dan BENAR-BENAR cepat juga. Hentikan omong kosong dari paha depan (khususnya karena paha depan akan membuat saya perlu menghitung jumlah ganda dari vertex)
Juga, ini lebih baik daripada menggunakan sistem partikel yang sudah dilakukan, karena saya ingin efek spesifik dan CEPAT, sistem partikel biasanya mendukung banyak fitur, dengan jumlah overhead yang proporsional.
sumber
Biasanya saya pikir Anda akan melakukan partikel sebagai paha tekstur-dipetakan. Perlakukan mereka sebagai sprite 2D pada dasarnya, dan pudar seiring waktu, menghancurkannya ketika tidak terlihat. Lebih baik lagi, gunakan kembali yang lama ketika Anda membuat yang baru sehingga Anda tidak meronta-ronta memori untuk hal-hal ini.
Jika Anda menggunakan alfa yang telah ditiru sebelumnya pada bidangnya maka Anda dapat dengan mudah mendukung lampu, api, asap, dan banyak lagi selain semua itu dengan satu jenis operasi pencampuran.
sumber
Dengan OpenGL ES 2.0, ES 1.X dengan ekstensi dan OpenGL => 2.1, Anda dapat menggunakan GL_POINT_SPRITES. GL_POINT_SPRITES seperti quad selalu di depan kamera.
Di fragmen shader, Anda dapat:
Anda dapat menggunakan tekstur dengan alpha untuk menggambar sprite bola ...
Tutorial untuk Point Sprite
sumber
Sebagian besar sistem efek partikel yang saya lihat, alih-alih menggambar sejumlah besar titik, menggambar sejumlah kecil tekstur papan iklan di mana masing-masing teksturnya terlihat agak seperti ledakan. Kecuali jika gaya seni Anda benar-benar menghalangi, Anda mungkin akan lebih senang melewati rute itu. Ini akan meminimalkan jumlah partikel yang Anda butuhkan untuk menghidupkan dan membuat secara individual sambil tetap memberikan efek visual yang besar.
sumber
Untuk cara kecil yang rapi untuk menangani pemijahan / penghapusan / pembaruan partikel, dengan asumsi Anda memiliki susunan partikel sederhana - Partikel [MAX_PARTICLES]:
Melacak partikel aktif (dimulai dengan NumActiveParticles = 0)
Partikel baru selalu ditambahkan di akhir array:
Bit pintar - Ketika menghapus partikel 'mati' - bertukar dengan partikel aktif terakhir, dan decrement NumActiveParticles:
Ini menghindari setiap pencarian 'partikel yang tidak digunakan' saat pemijahan, dan menghindari pemindaian melalui array MAX_PARTICLES jika tidak ada yang digunakan.
Perhatikan bahwa ini hanya berfungsi jika urutan pembaruan / render tidak penting (seperti halnya untuk banyak efek partikel, yang menggunakan campuran aditif) - karena metode penghapusan partikel ini memerintahkan ulang susunan array
sumber
Cara tercepat yang saya anggap adalah menemukan mesin partikel dan menggunakannya untuk efek Anda. Berikut ini beberapa di antaranya:
sumber