W jaki sposób w OpenGL mogę znaleźć zakres głębokości bufora głębokości?


11

Robię wieloprzebiegową aplikację renderującą GL na iOS. Pierwszy przebieg renderuje teksturę bufora głębokości. Drugi przebieg wykorzystuje wartości z bufora głębokości do kontrolowania zastosowania modułu cieniującego fragmenty. Chcę przeskalować wartości w buforze głębokości do czegoś użytecznego, ale zanim będę mógł to zrobić, muszę znać zakres wartości głębokości wartości bufora głębokości. Jak mam to zrobic?

Odpowiedzi:


10

Zakres wartości zapisywanych w buforze głębokości jest taki, jaki chcesz. Zazwyczaj mieszczą się w zakresie od 0 do 1. Rzeczywista wartość zapisywana w buforze głębokości jest obliczana podczas transformacji rzutni na podstawie wartości Z wierzchołka w przestrzeni NDC (po podzieleniu perspektywy przez w w przestrzeni klipu).

Wartość głębokości NDC (Z, po podzieleniu perspektywy przez W) jest skalowana przez część głębokości transformacji rzutni (która przenosi współrzędne X i Y do przestrzeni współrzędnych, którą można skojarzyć z pikselami w oknie), a następnie skalowana przez (2^n-1)- to należy rozumieć jako „dwa do potęgi n” - nto bitowa precyzja bufora głębokości. Wynikowa wartość jest zapisywana w buforze głębokości.

OpenGL dzieli definicję macierzy transformacji rzutni na wywołania glViewport i glDepthRange . glDepthRange kontroluje współczynnik skali odpowiedzialny za określenie żądanego zakresu głębokości. Możesz wywołać glGetFloatv za pomocą GL_DEPTH_RANGEselektora, aby odzyskać bieżący zakres. Umożliwi to korzystanie z zakresu bez zakładania, że ​​jest to od 0 do 1 (chociaż 99,9% czasu w praktyce nikt go nigdy nie zmienia).

Dalsza lektura, jeśli chcesz uzyskać wgląd w to, jak zrekonstruować matematykę, aby podążać za wartością Z na całej długości, od przestrzeni oka do bufora głębokości.


Dam Joshowi ten cały dodatkowy materiał źródłowy i wskazówkę dotyczącą płaskiej trójkąta. Jestem skłonny zrobić hack, w którym znajdują się bliskie / dalekie płaszczyzny klipu, aby dokładnie pasowały do ​​zasięgu Z geometrii, którą renderuję, aby mapa głębokości miała ładne wartości. Co mam na myśli? Chcę stworzyć ciekawe efekty rozmycia specyficzne dla lokalizacji podczas przejścia nr 2 w oparciu o mapę głębokości w przełęczy nr 1.
dugla

7

Wartości w buforze głębokości są zawsze w zakresie od 0-1. Zero polega na tym, że renderowany fragment znajduje się na głębokości bliskiej płaszczyzny, a 1 oznacza, że ​​fragment znajduje się na głębokości dalekiej płaszczyzny. I wszystko między tym.

Jeśli chcesz poznać prawdziwą głębokość w przestrzeni świata, łatwo jest ją obliczyć z bufora głębokości.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

I dlatego w swoich matriach projekcyjnych podajesz płaszczyzny bliskie i dalekie, aby uzyskać większą dokładność bufora głębokości.

Należy również pamiętać o różnicy między głębokością a odległością przy użyciu wartości bufora głębokości.


@notebene. Prawie na miejscu. Chcę przeskalować zakres wartości w buforze głębokości, aby wynosił dokładnie 0 -> 1. Więc jeśli renderowane wartości głębokości min / maks wynoszą 0,25 / .75, chcę (wartość głębi - .25) / (. 75 - .25). Czy istnieje sposób, aby odkryć min / max bufora głębokości po przejściu 1 i użyć go do przeskalowania podczas przejścia 2.
dugla

1
@dugla: ponieważ renderujesz trójkąty, które są płaskie, wówczas perforacja minimalne i maksymalne wartości głębokości zostaną powiązane z minimalnymi i maksymalnymi wierzchołkami w scenie. Jeśli znasz te dwa, możesz ręcznie przekształcić je do końca w potoku, a poznasz minimalne i maksymalne wartości, które zapisujesz w buforze głębokości. Jest to prawdopodobnie łatwiejsze niż renderowanie, a następnie odczytywanie całego bufora głębokości i iterowanie go.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.