Mengapa persimpangan-T pada jerat menghasilkan keretakan?

19

Saya telah mendengar dari banyak sumber bahwa memiliki T-junction di jerat 3D adalah ide yang buruk karena dapat mengakibatkan keretakan selama rendering. Dapatkah seseorang menjelaskan mengapa itu terjadi, dan apa yang dapat dilakukan seseorang untuk menghindarinya?

ap_
sumber

Jawaban:

20

Jawaban lhf baik dari perspektif tessellation, tetapi ini bisa terjadi dengan kasus penggunaan mesh segitiga sederhana.

Ambil contoh sepele dari tiga ini, segitiga layar-ruang , ABC, ADE dan DBE ...

masukkan deskripsi gambar di sini

Meskipun titik E, secara matematis, dimaksudkan tepat pada segmen garis AB, pipa tidak akan menggunakan nilai yang sepenuhnya tepat, seperti bilangan rasional (mis. Https://gmplib.org/ ). Sebagai gantinya, itu kemungkinan akan menggunakan float, dan beberapa aproksimasi / kesalahan akan diperkenalkan. Hasilnya mungkin akan menjadi seperti:

masukkan deskripsi gambar di sini

Perhatikan bahwa semua simpul mungkin memiliki ketidakakuratan. Meskipun contoh di atas menunjukkan celah, persimpangan-T malah menghasilkan tumpang tindih di sepanjang tepi yang menyebabkan piksel ditarik dua kali. Ini mungkin tidak tampak buruk, tetapi dapat menyebabkan masalah dengan transparansi atau operasi stensil.

Anda mungkin kemudian berpikir bahwa dengan floating-point kesalahan yang diperkenalkan akan tidak signifikan, tetapi dalam renderer, nilai-nilai vertex ruang layar (X, Y) hampir selalu diwakili oleh angka-angka titik tetap dan dengan demikian perpindahan dari lokasi yang ideal akan biasanya jauh lebih besar. Lebih lanjut, ketika perangkat keras rendering "menginterpolasi" segmen garis pixel-by-pixel dengan presisi internal sendiri, bahkan ada lebih banyak kesempatan itu akan menyimpang dari lokasi bulat E.

Jika pertigaan "dihapus" oleh, katakanlah, juga membagi segitiga ABC menjadi dua, yaitu AEC dan EBC, masalahnya akan hilang karena pergeseran yang diperkenalkan oleh kesalahan semua akan konsisten.

Sekarang, Anda mungkin bertanya mengapa penyaji (terutama HW) menggunakan matematika titik tetap untuk koordinat XY titik? Mengapa mereka tidak menggunakan floating-point untuk mengurangi masalah? Meskipun beberapa melakukannya (misalnya Dreamcast Sega) itu dapat menyebabkan masalah lain di mana matematika set-up segitiga menjadi tidak akurat, terutama untuk segitiga panjang-tipis, dan mereka mengubah ukuran dengan cara yang tidak menyenangkan.

Simon F
sumber
2
Ketika Anda mengatakan "nilai titik (X, Y) hampir selalu diwakili oleh angka titik tetap", saya kira maksud Anda koordinat titik ruang layar di rasterizer, bukan? Bukan simpul ruang-model asli.
Nathan Reed
2
@NathanReed Ya. Hanya layar-ruang X & Y (dan, mungkin pada beberapa GPU Z). Saya akan mengeditnya untuk membuatnya lebih jelas.
Simon F
9

Saat memodelkan permukaan parametrik dengan jala di domain parameter, persimpangan-T kemungkinan besar akan muncul sebagai diskontinuitas di permukaan. Ini akan muncul sebagai celah dalam rendering. Lihat di bawah.

Secara lebih umum, persimpangan-T dalam jerat segitiga mungkin akan menghasilkan diskontinuitas atribut yang diinterpolasi, seperti warna dan normals.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

lhf
sumber
4

Kesalahan pembulatan titik mengambang.

Setelah Anda mengubah persimpangan T dan titik di T bisa dibulatkan dari tepi.

Maka dapat terjadi bahwa sebuah fragmen yang diambil sampelnya untuk suatu piksel terletak pada celah antara 2 permukaan.

Ini dapat diperbaiki dengan tidak memiliki pertigaan sejak awal.

ratchet freak
sumber
3

Cara sederhana untuk menghindari ini adalah untuk memastikan bahwa semua simpul Anda dilas

Masalah Anda adalah Anda memiliki potongan di sepanjang tepian dengan simpul, tetapi Anda tidak memiliki simpul yang sesuai di tepi yang berdekatan untuk mengelas / menghubungkannya, jika Anda menganggapnya seperti tombol pada kemeja, Anda telah menaburkannya di tombol ke tepi, tetapi belum memberi lubang sehingga kain terbuka.

Pada gambar di bawah, titik-titik merah mewakili simpul yang dilas dengan benar, titik-titik biru semuanya membutuhkan simpul tambahan untuk dipotong ke tepi yang berdekatan.

masukkan deskripsi gambar di sini

Secara umum itu adalah praktik yang baik untuk menjaga pemodelan Anda di quad & tri, ini membantu untuk meringankan masalah ini karena Anda harus selalu memiliki simpul yang sesuai untuk dilas juga. Ini juga membantu menjaga quads jika Anda berencana untuk menggunakan metode pembagian apa pun pada mesh.

MephistonX
sumber