Saya memiliki masalah dalam mencari informasi tentang decals, jadi mungkin pertanyaan ini akan membantu orang lain. Implementasinya adalah untuk renderer maju.
Bisakah seseorang mengonfirmasi jika saya mendapat implementasi stiker yang benar?
- Anda menentukan kubus dimensi apa pun yang akan menentukan volume proyeksi di ruang umum. Anda memeriksa persimpangan segitiga dengan kubus yang ditentukan untuk menerima segitiga yang akan mempengaruhi proyeksi.
- Anda klip segitiga ini dan simpan.
- Anda kemudian menggunakan trik matriks untuk menghitung koordinat UV untuk segitiga tersimpan yang akan referensi tekstur yang Anda proyeksikan.
- Untuk melakukan ini, Anda mengambil vektor yang mewakili tinggi, lebar dan kedalaman kubus di ruang bersama, sehingga sudut kiri bawah adalah asalnya.
- Anda menempatkan bahwa dalam matriks sebagai vektor unit i, j, k, mengatur terjemahan untuk kubus, maka Anda membalikkan matriks ini.
- Anda mengalikan simpul segitiga yang disimpan dengan matriks ini, dengan cara itu Anda mendapatkan koordinatnya di dalam kubus ukuran 0 hingga 1 yang Anda gunakan sebagai koordinat UV.
- Dengan cara ini Anda memiliki segitiga asli yang Anda proyeksikan dan Anda memiliki koordinat UV untuk mereka (koordinat UV merujuk pada tekstur yang Anda proyeksikan).
- Kemudian Anda rerender segitiga yang disimpan ke tempat kejadian dan mereka menimpa area proyeksi dengan gambar yang diproyeksikan.
Sekarang pertanyaan yang tidak dapat saya temukan jawabannya. Apakah poin terakhir benar? Saya tidak pernah melakukan pemangkasan perangkat lunak, tetapi tampaknya cukup rawan kesalahan, karena ketepatan yang terbatas, bahwa akan ada beberapa perkelahian yang terjadi untuk tekstur yang diproyeksikan. Juga apakah cara mendapatkan koordinat UV benar?
Jawaban:
Lihatlah artikel ini:
http://blog.wolfire.com/2009/06/how-to-project-decals/
Sepertinya dia menggunakan pendekatan yang sama persis yang Anda gunakan. Dia tidak berbicara tentang z-fight, tapi itu pasti bisa menjadi masalah pada jarak yang lebih jauh.
Saran saya adalah menonaktifkan decals setelah jarak tertentu jika z-fight menjadi sangat terlihat.
sumber
Apa yang saya lakukan untuk menyelesaikan pertarungan Z adalah untuk menabrak nilai Z titik dengan sejumlah kecil, di shader decal saya, setelah itu di koordinat layar.
Oke ..... Saya menggunakan decals mesh yang pas. Saya membuat mesh nxn dengan Y duduk di medan. Saya menggunakan kode untuk menemukan Y pada medan poligon. Setelah semua transfrom, saya menggambar di atas geometri yang ada di koordinat layar. Buffer kedalaman ada di koordinat layar sehingga dengan menggerakkan Z dari poligon decals sedikit ke arah layar, ia menghentikan pertempuran Z. Dengan melakukan ini, saya mengurangi jumlah poligon yang membentuk jerat decals pas saya menjadi setengahnya. Ini adalah kode 120 lama
Semoga ini menjelaskan lebih baik .. (seperti yang diminta)
sumber