Saya benar-benar tidak tahu apa yang menyebabkan satu permukaan saling tumpang tindih. Dalam mesin 3D yang saya buat, teknik saya gagal dalam kasus tepi.
Metode saya adalah menyortir permukaan yang akan dicat dari yang terjauh ke terdekat. Untuk menentukan kedekatan, saya membandingkan nilai rata-rata z. Kadang-kadang, bagaimanapun, permukaan tumpang tindih memiliki tinggi nilai z rata-rata dari yang itu tumpang tindih. Dengan demikian, permukaan yang lebih jauh dicat lebih dekat - menghasilkan rendering aneh seperti ini:
Apa yang dimaksudkan untuk dilihat adalah permukaan depan ungu dari kubus saja, sementara permukaan sisi merah dicat di atas permukaan ungu. Nilai rata-rata z dari permukaan ungu lebih tinggi, dan karenanya 'lebih jauh'. Jadi saya ragu apakah teknik ini benar.
Apa yang saya coba adalah mendapatkan jarak dari kamera (yaitu asal) ke permukaan, tetapi kemudian saya membutuhkan sebuah titik. Saya memilih bagian tengah dari setiap permukaan tetapi juga ini sepertinya tidak selalu berhasil karena tidak semua permukaan sama besar.
Oleh karena itu, apa cara yang dapat diandalkan untuk menentukan urutan kedekatan permukaan terhadap asal?
Apa yang Anda miliki adalah masalah visibilitas . Salah satu solusinya adalah menggunakan z-buffer .
sumber
Menyortir wajah sesuai dengan nilai rata-rata z mereka tidak berfungsi, karena nilai rata-rata z tidak memberikan informasi tentang nilai z aktual dari simpul atau bahkan piksel permukaan.
Contoh (peringatan, ASCII art depan):
Ada dua wajah A dan B. Dari sudut pandang kamera A ada di depan B. Namun nilai rata-rata B lebih kecil. Mari kita lihat nilai-z lainnya:
Anda bisa mencoba mengurutkannya berdasarkan nilai z minimalnya tetapi ada kasus di mana itu tidak akan berhasil juga. Tidak ada cara untuk mengurutkan wajah sewenang-wenang dengan benar menggunakan hanya satu nilai z.
Dalam algoritma Newell, http://en.wikipedia.org/wiki/Newell 's_algorithm yang Anda lakukan adalah mengurutkan min / max-rentang dari nilai-z. Jika rentang dua wajah tidak tumpang tindih, Anda bisa tahu pasti yang mana di depan. Jika ya, terkadang Anda benar-benar harus membelah wajah. Kadang-kadang cukup untuk raytrace setiap titik untuk oklusi atau teknik lainnya.
sumber
Ada baiknya Anda belajar tentang rendering dengan melakukan. Pujian. Dalam contoh ini, tidak ada solusi "pelukis algoritma", alih-alih mencoba memperbaikinya dengan mengurutkan, pada PS1 kami dulu hanya mencoba untuk menjaga poligon di sekitar ukuran yang sama ketika mereka bersebelahan (yang Anda lakukan sebagai Sejauh yang saya tahu), dan backface cull (yang tidak Anda lakukan)
Culling backface adalah memeriksa permukaan normal dalam ruang layar untuk arahnya (hanya mendapatkan tanda elemen kedalaman dari ruang layar berubah normal (dalam kasus kami itu adalah z dari normal), atau produk silang dari dua vektor dari segitiga yaitu lintas (v1-v0, v2-v0))
Jika Anda menerapkan pemusnahan backface, Anda juga mengurangi jumlah rasterisasi yang Anda lakukan .. menang ganda.
sumber