Saya hanya punya ide untuk game saya yang sedang berjalan yang dibuat dengan opengl di c ++: Saya ingin memiliki garis besar (5-6 piksel) pada beberapa objek yang tumpang tindih ketika pemain memenangkan sesuatu.
Saya pikir cara terbaik adalah dengan menggunakan buffer stensil tetapi beberapa jam saya mencoba melakukan render stensil di luar layar dan saya tidak dapat mencapai hasil apa pun jadi mungkin. ada beberapa teknik lain!
Inilah yang ingin saya dapatkan:
Ada ide?
Jawaban:
Berikut adalah kode yang diadaptasi dari beberapa kode stensil webGL yang telah saya kerjakan:
Saya pikir saya telah menggunakan pendekatan ini dalam game RTS untuk menggambar lingkaran cahaya di sekitar unit yang dipilih, tapi itu sudah lama sekali dan saya tidak ingat apakah ada gotcha dan semua nuansa.
sumber
Mulailah dengan menemukan semua kelompok objek, di mana sekelompok objek adalah kumpulan objek yang tumpang tindih. Deteksi tabrakan standar harus melakukan pekerjaan. Tetapkan warna unik untuk masing-masing grup. Warna apa pun akan berhasil.
Jadikan semua objek Anda sebagai warna solid, menggunakan warna grup, menjadi tekstur.
Buat tekstur garis baru dengan dimensi yang sama dengan target render. Memindai melalui setiap texel dari target render dan menentukan apakah warnanya berbeda dengan setiap texel di sekitarnya. Jika ya, ubah texel yang sesuai dalam tekstur garis ke warna garis yang Anda inginkan.
Akhirnya, ambil garis besar tekstur ini dan render di atas gambar yang ingin Anda gambar di layar (Anda tentu saja bisa melakukan ini pada saat yang sama dengan deteksi tepi dalam shader fragmen dan hindari membuat tekstur tepi di pertama tempat).
Jika Anda melakukan langkah ini pada cpu dengan menggunakan for loop untuk melewati texels target render, maka ini akan sangat lambat, tetapi mungkin cukup baik untuk menguji dan bahkan digunakan dalam beberapa kasus. Untuk menggunakan ini dalam waktu nyata Anda sebaiknya menangani ini dalam shader.
Sebuah shader fragmen untuk melakukan deteksi tepi ini mungkin terlihat seperti ini;
Di mana nilai kedua dalam pencarian tekstur2D adalah koordinat 2d relatif terhadap v_texCoord. Anda akan menerapkan ini dengan merender target render pertama sebagai tekstur pada quad layar penuh. Ini mirip dengan bagaimana Anda akan menerapkan efek buram layar penuh seperti guassian blur.
Alasan untuk menggunakan target render pertama dengan warna solid adalah hanya untuk memastikan bahwa tidak ada perbedaan antara objek yang berbeda yang tumpang tindih. Jika Anda hanya melakukan deteksi tepi pada gambar layar, Anda mungkin akan menemukan juga mendeteksi tepi pada tumpang tindih (dengan asumsi objek memiliki warna / tekstur / pencahayaan yang berbeda).
sumber