Podczas renderowania dwóch nakładających się współpłaskich powierzchni powszechnym problemem jest „walka z”, w której renderer nie może zdecydować, która z dwóch powierzchni znajduje się bliżej kamery, dając wizualne artefakty w obszarze nakładania się.
Standardowym rozwiązaniem tego problemu jest nieznaczne przesunięcie powierzchni podczas projektowania modelu. Czy jest jakieś inne rozwiązanie?
Odpowiedzi:
Jeśli powierzchnie są dokładnie współstrugające, twój los zależy od bogów FPU; najprawdopodobniej będziesz walczył z Z. Jeśli trójkąty są identyczne i wykonasz dokładnie taką samą matematykę dla każdego, to zrobisz to same wartości Z dla obu. Ale znowu stanie się tak tylko wtedy, gdy operacje matematyczne będą identyczne dla obu. (Ponieważ zasadniczo operacje FPU nie są przemienne)
Jednym z możliwych rozwiązań jest całkowite niestosowanie bufora Z. Zamiast tego możesz użyć algorytmu malarza . To prawda, że wiąże się to również ze wszystkimi problemami algorytmu malarzy. Ale rozwiązałoby to walkę Z.
W twoim przypadku ekranowych naklejek przestrzeni (SSD), powszechnym rozwiązaniem jest użycie przesunięcia, czyli prostej cienkiej kostki. Zobacz prezentację Warhammer 40k na temat dysków SSD. Lub post Barta Wrońskiego, w którym poruszono inne problemy z naklejkami, ale także linki do kilku innych prezentacji na temat dysków SSD
źródło
Oto jak rozwiązałem to w przeszłości:
Uwaga: aby to zadziałało, obiekty muszą być rysowane kolejno.
źródło
W zależności od renderera możesz sprawić, że powierzchnie będą bardziej „rozmyte”, stosując minimalne przesunięcie na głębokości multisamplingu przy użyciu algorytmu przypominającego szum. Powinno to dać efekt mieszania dla powierzchni znajdujących się w bliskiej odległości. Dla tego, co wiem, ustawienie głębokości dla próbki w module cieniującym fragmenty jest całkiem nowe w OpenGL, a potem tylko jako rozszerzenie.
OpenGL ma PolygonOffset, ale wymaga wcześniejszej wiedzy, że zamierzasz uczynić coś współpłaszczyznowym. Chociaż nie jest to możliwe w przypadku powierzchni w ramach jednego modelu, może dobrze działać na przykład podczas renderowania drogi nałożonej na kawałek terenu.
źródło