2009-06-27 14 views
8

pierwszy raz tutaj. Dzisiaj siedzę i uczę się OpenGL. Ale natknąłem się na pytanie, na które nie mogę znaleźć odpowiedzi. Zastanawiam się, dlaczego testowanie głębokości wydaje się być niezgodne z półprzezroczystymi obiektami w OpenGL. Dokumentacja sugeruje, że należy wyłączyć testowanie głębokości, a następnie narysować obiekty w kolejności odwrotnej, a mieszanie będzie działać poprawnie.Testowanie głębokości Z w OpenGL

Ale dlaczego OpenGL nie może użyć tego samego testu głębokości, który zawsze ma na celu ustalenie, co jest najdalej w kolejności odwrotnej odległości i zrobić to za Ciebie? Czy jest to tylko ograniczenie struktury, czy ma to coś wspólnego z tym, co możesz zrobić wydajnie w sprzęcie graficznym, czy coś w tym stylu?

Po prostu zastanawiam się. Mam nadzieję, że ktoś tutaj da się wyjaśnić.

Odpowiedz

11

Dobre pytanie.

Krótka odpowiedź polega na tym, że bufor Z przechowuje pojedynczą wartość (tylko) dla każdego piksela w buforze ramki. Biorąc pod uwagę "zwykły" tryb działania (dla obiektów nieprzezroczystych - GL_DEPTH_TEST włączone, glDepthFunc ustawione na GL_LESS), ta wartość będzie głębokością najbliższego fragmentu, który jest mapowany do tego piksela.

Bufor ramki to "głupie" urządzenie - każdy fragment rasteryzuje i testuje głębokość niezależnie od wszystkich innych i rozwiewa się od jakiejkolwiek koncepcji prymitywu, który ją wyprodukował. Tak więc, nie ma miejsca na informacje o poprzednich prymitywach, sortowaniu głębokości itp., Które byłyby wymagane do wdrożenia funkcji "automatycznej przezroczystości".

Możesz zajrzeć do "wykresów sceny", aby uzyskać pomoc dotyczącą sortowania głębokości. Są to biblioteki, które dodają funkcje "wyższego poziomu" poza podstawowe rzeczy, które oferuje OpenGL.

Mam nadzieję, że to pomoże.

2

Nie słyszałem o wyłączaniu testowania głębokości. Chcesz testowania głębokości przezroczystych obiektów.

Po prostu nie chcesz, aby przezroczyste obiekty zapisywały się w buforze z, ponieważ wtedy dziurkaliby dziury w czymkolwiek za nimi, co zostało narysowane później.

+0

Zastanawiam się, dlaczego to zostało przegłosowane, ponieważ jeśli używałeś OpenGL, tak jak on sugerował, wszystko rysowane po twoim przezroczystym obiekcie, ale za nim, całkowicie zignoruje przezroczysty obiekt, wyraźnie nieprzeznaczony. – Blindy

+1

To jest sedno - rysujesz przezroczyste elementy na końcu, z włączonym testowaniem głębokości, ale zapisywanie głębokości jest wyłączone. W ten sposób przezroczyste rzeczy są nadal zasłaniane przez nieprzezroczyste przedmioty, które są przed nim. –

+0

Rysujesz przezroczyste obiekty na końcu, z powrotem na przód. Zakładałem, że już to wiedział, skoro wymienił kolejność odwrotną i pytał o buforowanie z. – David

3

OpenGL zapisuje do bufora głębi jeden piksel na raz i renderuje trójkąty, które tworzą piksele w takiej kolejności, w jakiej są prezentowane OpenGL. OpenGL nie dokonuje żadnego głębokiego sortowania trójkątów, to od struktury wywoływania zależy to od sposobu, który jest najbardziej wydajny dla tej aplikacji. Ma to na celu szybkość i elastyczność, ponieważ najbardziej efektywnym sposobem renderowania wielu trójkątów jest przechowywanie ich w ciągłych buforach wierzchołków i indeksów, a jeśli interfejs API musi martwić się o sortowanie wszystkich ramek, to rzeczy znacznie wolniejsze.

Ponadto materiały nie są bezpośrednio powiązane z trójkątami w interfejsie API, więc OpenGL naprawdę nie ma możliwości sprawdzenia, które z nich są przezroczyste, a które nieprzezroczyste, aż do momentu, w którym są faktycznie renderowane.

Najlepszym sposobem na zrobienie tego jest narysowanie wszystkich nieprzezroczystych trójkątów, a następnie narysowanie na końcu wszystkich trójkątów z przezroczystymi/alfa. Zazwyczaj chcesz włączyć testowanie głębokości, ale wyłączono pisanie głębi i sortuj przezroczyste trójkąty z powrotem na przednie, aby uzyskać prawidłowe mieszanie. Sposób, w jaki zwykle to robię, polega na posiadaniu wykresu sceny z pewną liczbą wiader, a kiedy dodaję trójkąty do wykresu sceny, automatycznie rozdzielę je na odpowiednie segmenty, które będą renderowane we właściwej kolejności.

Powiązane problemy