Cara menyembunyikan garis jala pasca-diproses saat / di mana jala tersembunyi


10

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.

masukkan deskripsi gambar di sini

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:

hasil

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.


Telah melihat repo Anda. Apakah Anda pernah menemukan solusi yang dapat diterima?
iKlsR

Jawaban:


0

Saya akan membuat seluruh adegan menjadi buffer stensil dengan objek yang diuraikan yang diinginkan untuk mengatur sedikit dan untuk hal lain untuk membuang / menghapus bit.

Kemudian singkirkan deteksi tepi, Anda tidak perlu itu, alih-alih Anda bisa memperbesar buffer sedikit. Jadi setiap objek hanya tumbuh sedikit.

Dari sana Anda memiliki penyangga stensil yang memiliki garis yang Anda butuhkan. Ini semua tentang memastikan bahwa objek lain yang Anda render mematikan bit di buffer stensil Anda.


2
Terima kasih balasannya. Bukankah metode ini akan mengalami masalah serupa dengan ketebalan garis dan bentuk cekung jika penskalaan dilakukan dalam 3d? Atau masalah perpindahan jika dilakukan dalam 2d dan objek yang diuraikan tidak berada di tengah layar yang mati?
nils

0

1) dalam objek frame buffer, Anda dapat menjalankan shader laplacian di GPU untuk mendapatkan kontur.

2) Anda harus menggunakan buffer kedalaman akhir saat Anda menggambar objek Anda di FBO, dengan cara itu Anda hanya akan menggambar bagian yang terlihat dari objek Anda di FBO, dan laplacian hanya akan membentuk kontur bagian yang terlihat.


Hai, terima kasih atas jawabannya. Saya sudah melakukan ini untuk mencapai garis besar yang saya miliki. Saya pikir Anda tidak pantas menerima downvote untuk jawaban ini, jadi upvoting.
nil

0

Saya harap saya bisa memperjelas ini, tetapi pada dasarnya Anda perlu membuat stensil dari kedua objek seolah-olah keduanya dipilih, maka hanya menyimpan area dalam kotak pembatas item yang ingin Anda sorot.

Jadi pada dasarnya Anda membuat satu penyangga stensil dari kedua objek yang dipilih (atau semua objek yang menyumbat objek, benar-benar ... tapi saya tidak akan khawatir tentang kasus-kasus kecuali itu benar-benar muncul banyak - jika itu yang tersumbat orang tidak akan mengharapkan ini sangat membantu), lalu dan dengan stensil kotak pembatas untuk objek Anda.

Itu akan mendapatkan efek yang Anda cari.

Atau Anda dapat meninggalkan hasil 'buruk' dan saya tidak berpikir kebanyakan orang akan terlalu peduli, meskipun ini tergantung pada data / permainan Anda dan terutama ukuran objek.

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.