XNA Adding Craters (via GPU) dengan Efek "Bakar"


11

Saat ini saya sedang mengerjakan klon "Worms" 2D di XNA, dan salah satu fiturnya adalah medan "yang dapat dideformasi" (mis. Ketika sebuah roket mengenai medan, ada ledakan dan sepotong medan menghilang).

Cara saya saat ini melakukan ini adalah dengan menggunakan tekstur yang memiliki nilai Red semakin tinggi saat mendekati pusat. Saya menggilir setiap piksel dari tekstur "Kerusakan" itu, dan jika piksel saat ini tumpang tindih dengan piksel medan dan memiliki nilai merah yang cukup tinggi, saya memodifikasi susunan warna yang mewakili medan menjadi transparan. Jika piksel saat ini TIDAK memiliki nilai Merah yang cukup tinggi, saya menghitamkan warna medan (semakin gelap semakin dekat nilai Merah ke ambang). Di akhir operasi ini saya menggunakan SetData untuk memperbarui tekstur medan saya.

Saya menyadari ini bukan cara yang baik untuk melakukannya, bukan hanya karena saya telah membaca tentang saluran pipa dan semacamnya, tetapi juga karena itu bisa menjadi sangat lamban jika banyak kawah ditambahkan pada saat yang sama. Saya ingin membuat ulang Generasi Kawah saya di GPU sebagai gantinya menggunakan Target Render "ping-ponging" antara menjadi target dan tekstur untuk dimodifikasi. Bukan itu masalahnya, saya tahu bagaimana melakukannya. masalahnya adalah saya tidak tahu bagaimana cara menjaga efek luka bakar saya menggunakan metode ini.

Begini cara efek terbakar terlihat sekarang:

Efek Bakar

Adakah yang tahu bagaimana saya akan menciptakan efek luka bakar yang serupa (menggelapkan tepi di sekitar kawah yang terbentuk)? Saya benar-benar tidak terbiasa dengan Shader tetapi jika itu mengharuskan saya, saya akan sangat berterima kasih jika seseorang menuntun saya bagaimana melakukannya. Jika ada cara lain yang bagus juga.


Jawaban:


7

Salah satu cara Anda dapat melakukannya mirip dengan apa yang telah Anda lakukan. Memiliki tekstur "Kerusakan" dan tekstur latar belakang yang sebenarnya, tetapi alih-alih menyalin data setiap kali, buat keduanya sebagai dua tekstur terpisah.

Saat ledakan dilakukan, gambar sebuah lingkaran pada tekstur Damage yang memiliki tepi yang sedikit transparan. Ini akan menjadi area "bakar".

Setiap kali Anda menggambar medan, berikan GPU kedua tekstur, dan minta shader mengalikan warna (.rgb) piksel latar belakang dengan 1 - nilai alfa dari tekstur kerusakan. Singkirkan piksel yang sepenuhnya hitam (alfa hingga 0, atau Anda dapat melipatgandakannya menjadi alpha juga (.rgba alih-alih .rgb) tergantung apakah Anda ingin area yang hangus transparan) dan voila!

Saya ragu ini adalah solusi terbaik , tetapi ini cukup mirip dengan apa yang telah Anda lakukan sebelumnya yang dapat mempermudah transfer. Anda mungkin juga bisa lolos dengan melewati array Vector3's (x, y, radius) dan melakukan beberapa matematika di shader berdasarkan pada titik-titik ledakan itu tetapi saya tidak yakin dengan efisiensi seperti itu.

Semoga ini membantu!


Terima kasih! Itu cara yang keren untuk melakukannya juga, dan mirip dengan apa yang saya lakukan sekarang, seperti yang Anda katakan. Saya tidak tahu apa-apa tentang HLSL tetapi saya pasti akan memeriksanya. Cara lain yang saya tahu bisa saya lakukan adalah menghitamkannya ketika saya mendekati tepi kawah, tetapi saya akan mencoba cara ini juga.
Benixo
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.