Naprawdę nie mogę zrozumieć, co powoduje, że jedna powierzchnia zachodzi na drugą. W silniku 3D, który tworzę, moja technika zawodzi w skrajnych przypadkach.
Moją metodą jest sortowanie powierzchni do malowania od najdalszych do najbliższych. Aby określić bliskość, porównuję średnie wartości z. Czasami jednak nakładająca się powierzchnia ma wyższą średnią wartość Z niż ta, na którą się nakłada. Tak więc powierzchnia znajdująca się dalej jest namalowana na bliższej, co powoduje dziwne renderowanie:
To, co należy zobaczyć, to tylko fioletowa przednia powierzchnia sześcianu, podczas gdy czerwona powierzchnia boczna jest pomalowana na fioletowej. Średnia wartość Z fioletowej powierzchni jest wyższa, a zatem „dalej”. Mam wątpliwości, czy ta technika jest poprawna.
Próbowałem też uzyskać odległość od aparatu (tj. Początek) do powierzchni, ale wtedy potrzebowałem punktu. Wybrałem środek każdej powierzchni, ale nie zawsze wydaje się to działać, ponieważ nie wszystkie powierzchnie są tak duże od siebie.
Dlatego jaki jest niezawodny sposób określenia kolejności bliskości powierzchni w stosunku do źródła?
To, co masz, to problem z widocznością . Jednym z rozwiązań jest za pomocą bufora Z .
źródło
Sortowanie ścian według ich średniej wartości Z nie działa, ponieważ średnia wartość Z nie dostarcza informacji o rzeczywistej wartości Z wierzchołków, a nawet pikseli powierzchni.
Przykład (ostrzeżenie, grafika ASCII przed nami):
Istnieją dwie twarze A i B. Z perspektywy aparatu A znajduje się przed B. Jednak średnia wartość Z dla B jest mniejsza. Spójrzmy na inne wartości Z:
Możesz spróbować posortować je według ich minimalnych wartości Z, ale są przypadki, w których to też nie zadziała. Po prostu nie ma możliwości prawidłowego sortowania dowolnych ścian przy użyciu tylko jednej wartości Z.
W algorytmie Newella http://en.wikipedia.org/wiki/Newell 's_algorytm to, co robisz, to sortowanie zakresów min / max wartości Z. Jeśli zakresy dwóch ścian się nie pokrywają, możesz być pewien, która z nich jest z przodu. Jeśli tak, czasami trzeba absolutnie podzielić twarze. Czasami wystarczy prześledzić każdy wierzchołek w celu okluzji lub innej techniki.
źródło
Dobrze, że uczysz się o renderowaniu przez działanie. Sława. W tym przypadku nie ma rozwiązania „algorytmu malarzy”, zamiast próbować to naprawić przez sortowanie, na PS1 próbowaliśmy utrzymać wielokąty mniej więcej tego samego rozmiaru, gdy były obok siebie (co robisz jako o ile mogę powiedzieć) i cull backface (czego nie robisz)
Wykończenie tylnej powierzchni sprawdza, czy powierzchnia jest normalna w przestrzeni ekranu pod kątem jej kierunku (wystarczy uzyskać znak elementu głębokości z przestrzeni ekranu przekształconej normalnie (w naszym przypadku była to wartość z normy) lub iloczyn krzyżowy dwóch wektorów trójkąt tj. krzyż (v1-v0, v2-v0))
Jeśli zastosujesz culling backface, zmniejszysz również ilość rasteryzacji, którą wykonujesz .. podwójna wygrana.
źródło