Implementasi stiker

11

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?

dreta
sumber
Berikut ini tautan dengan tautan: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Jawaban:

5

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.

knight666
sumber
Saya telah melihat artikel ini beberapa kali, masalahnya adalah ia tidak berbicara sama sekali tentang apa yang saya tanyakan, seperti yang telah Anda sebutkan, pertarungan z sebenarnya bukan masalah jarak, hanya saja Anda Sedang mencoba me-render tepat di atas geometri yang ada dan karena presisi terbatas, dapat / tidak bisakah Anda yakin bahwa itu akan berada di atas atau tepatnya di tempat yang sama
dreta
1
Saat menggambar decals, Anda selalu dapat mengatur fungsi perbandingan kedalaman buffer menjadi kurang dari atau sama dengan daripada kurang dari itu sehingga decals selalu digambar tepat di atas permukaan yang mereka pengaruhi.
jmegaffin
1

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

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Semoga ini menjelaskan lebih baik .. (seperti yang diminta)

Semua bingkai kawat.

Hanya medan kawat.

Mike O
sumber
1
Jawaban ini tampaknya sangat pendek dan tidak spesifik. Bisakah Anda mengklarifikasi jawaban Anda?
Gnemlock
1
Tidak sulit untuk mengerti .. Saya memindahkan titik hanya dengan sedikit Z mengarahkan di ruang layar. Karena di OpenGL Anda selalu mencari Z positif di ruang layar, menggerakkan Z negatif sedikit memperbaiki pertempuran Z. Namun ada masalah dengan ini. Saat Anda memperkecil, z dapat memindahkan decal lebih dari yang dibutuhkan. Cara mengatasinya adalah dengan mengukur jumlah shift berdasarkan mata ke jarak verteks.
Mike O