Saya sedang mengerjakan pengaturan garis aktif di mesin 3d saya, efek highlight untuk karakter 3d yang dipilih atau pemandangan di layar. Setelah bekerja dengan buffer stensil dan mendapatkan beberapa hasil yang tidak memuaskan (masalah dengan bentuk cekung, ketebalan garis karena jarak dari kamera, dan ketidakkonsistenan antara desktop dan laptop saya), saya beralih ke deteksi tepi dan pengambilan sampel frame buffer dan mendapat garis besar saya. cukup puas dengan.
Namun, saya tidak dapat menyembunyikan garis saat jala yang dipilih berada di belakang jala lain. Ini masuk akal mengingat proses saya, karena saya hanya membuat garis besar shader 2d dari buffer bingkai setelah menampilkan sisa adegan.
Dua tangkapan layar hasil saya di bawah ini. Yang pertama adalah garis "baik", yang kedua adalah di mana garis tersebut terlihat di atas jala yang menghalangi sumber garis.
Proses rendering berjalan seperti ini: 1) Gambarlah hanya alpha dari mesh yang disorot, menangkap siluet hitam dalam buffer bingkai (framebuffer1).
2) Lewati tekstur dari framebuffer1 ke shader kedua yang melakukan deteksi tepi. Capture edge dalam framebuffer2.
3) Render seluruh adegan.
4) Render tekstur dari framebuffer2 di atas layar.
Saya punya beberapa ide tentang bagaimana mencapai dan berharap mendapatkan umpan balik tentang validitasnya, atau pada metode yang lebih sederhana atau lebih baik.
Pertama, saya telah memikirkan rendering seluruh adegan ke bingkai penyangga dan menyimpan siluet yang terlihat dari mesh yang disorot di saluran alpha (semua putih menyimpan di mana mesh yang disorot terlihat). Saya kemudian akan melakukan deteksi tepi pada saluran alfa, membuat buffer bingkai adegan dan kemudian membuat tepi di atas. Menghasilkan sesuatu seperti ini:
Untuk mencapai ini, saya berpikir untuk menetapkan define hanya selama render pass dari objek yang disorot yang akan menggambar semua hitam di alpha untuk setiap piksel yang terlihat.
Gagasan kedua saya adalah menggunakan proses render saat ini yang diuraikan di atas, tetapi juga menyimpan koordinat X, Y dan Z dalam kanal R, G dan B dari framebuffer1 saat merender siluet dari mesh yang dipilih. Deteksi tepi akan dilakukan dan disimpan dalam framebuffer2, tapi saya akan meneruskan nilai-nilai RGB / XYZ dari tepi alpha ke siluet. Kemudian, ketika merender adegan, saya akan menguji apakah koordinat berada di tepi disimpan dalam framebuffer2. Jika demikian, saya kemudian akan menguji kedalaman fragmen saat ini untuk menentukan apakah itu di depan atau di belakang koordinat yang diekstraksi dari saluran RGB (dikonversi ke ruang kamera). Jika fragmen berada di depan koordinat kedalaman, fragmen akan ditampilkan secara normal. Jika fragmen di belakang, itu akan diberikan sebagai warna garis padat.
Saya menggunakan LibGDX untuk proyek ini dan ingin mendukung WebGL dan OpenGL ES, jadi tidak ada solusi yang melibatkan geometri shaders atau fungsi GLSL yang lebih baru tersedia untuk saya. Jika ada yang bisa mengomentari pendekatan yang saya usulkan atau mengusulkan sesuatu yang lebih baik saya akan sangat menghargainya.