Kendi yazılım 3d rasterizer yazmak zorundayım ve şimdiye kadar üçgenlerden oluşan 3d modelimi 2d uzaya yansıtabiliyorum:
Her üçgenin 2d uzayı temsil etmesi için puanlarımı döndürür, tercüme eder ve yansıtırım. Sonra 3 üçgen noktasını alıyorum ve üçgenlerin kenarları (sol ve sağ) boyunca tüm noktaları [x] [y] bulmak için tarama çizgisi algoritmasını (doğrusal enterpolasyon kullanarak) uyguluyorum, böylece üçgeni yatay olarak tarayabiliyorum, satır satır ve piksel ile doldurun.
Bu çalışıyor. Dışında z tamponlama uygulamak zorundayım. Bu, üçgenin 3 köşesinin döndürülmüş ve çevrilmiş z koordinatlarını bilerek, tarama çizgisi algoritmamla bulduğum diğer tüm noktalar için z koordinatını enterpolasyonlamak zorunda olduğum anlamına gelir.
Kavram yeterince açık görünüyor, önce bu hesaplamalarla Za ve Zb'yi buluyorum:
var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y);
var Za = top_point_z + ((current_point_y - top_point_y) * Z_Slope);
Sonra her Zp için aynı enterpolasyonu yatay olarak yaparım:
var Z_Slope = (right_z - left_z) / (right_x - left_x);
var Zp = left_z + ((current_point_x - left_x) * Z_Slope);
Ve eğer geçerli z izleyiciye bu dizindeki önceki z'den daha yakınsa, rengi renk arabelleğine yazın VE yeni z'yi z arabelleğine yazın. (koordinat sistemim x: sol -> sağ; y: üst -> alt; z: yüzünüz -> bilgisayar ekranı;)
Sorun şu ki, haywire gidiyor. Proje burada ve "Z-Buffered" radyo düğmesini seçerseniz, sonuçları göreceksiniz ... ( "Z-Buffered" modunda ressamın algoritmasını (sadece tel kafes çizmek için) kullandığımı unutmayın) hata ayıklama amacıyla )
PS: Burada , z = 1/z
enterpolasyon yapmadan önce z'leri karşılıklarına (yani ) çevirmeniz gerektiğini okudum . Bunu denedim ve görünüşe göre bir değişiklik yok. Neyi kaçırıyorum? (Herkes tam olarak z'yi 1 / z'ye nereye çevirmeniz gerektiği ve nerede (eğer) geri çevirmeniz gerektiği konusunda netleştirebilir mi?)
[EDIT] Hangi maksimum ve minimum z değerlerini aldığımla ilgili bazı veriler:
max z: 1; min z: -1; //<-- obvious, original z of the vertices of the triangles
max z: 7.197753398761272; min z: 3.791703256899924; //<-- z of the points that were drawn to screen (you know, after rotation, translation), by the scanline with zbuffer, gotten with interpolation but not 1/z.
max z: 0.2649908532179404; min z: 0.13849507306889008;//<-- same as above except I interpolated 1/z instead of z.
//yes, I am aware that changing z to 1/z means flipping the comparison in the zBuffer check. otherwise nothing gets drawn.
Özenli hata ayıklamaya başlamadan önce, birisi şimdiye kadar kavramımın doğru olduğunu onaylayabilir mi?
[EDIT2]
Z-tamponlamayı çözdüm. Anlaşıldığı gibi, çizim sırası hiç bozulmadı. Z koordinatları doğru hesaplanıyordu.
Sorun, kare hızımı artırmak için, ekrandaki gerçek pikseller yerine her 4 pikselde 4 piksel / 4 piksel kutu çiziyordum. Bu yüzden piksel başına 16 piksel çiziyordum, ancak bunlardan yalnızca biri için z arabelleğini kontrol ediyordum. Ben böyle bir boobum.
TL / DR: Soru hala duruyor: Z yerine Z'nin (1 / z'de olduğu gibi) karşılığını nasıl / neden / ne zaman kullanmalısınız? Çünkü şu anda her şey her iki şekilde de çalışıyor. (fark edilir bir fark yoktur).