Wykonuję grę 2D za pomocą OpenGL. Chcę zrobić rysunek, najpierw kopiuję dane wierzchołków wszystkich obiektów, które chcę narysować w VBO (jeden VBO na teksturę / shader), a następnie rysuję każdy VBO w osobnym wywołaniu. Wydawało mi się to dobrym pomysłem, dopóki nie zorientowałem się, że zepsuje porządek rysowania - wygrane wywołania nie muszą być w porządku, aby obiekty były ładowane do VBO. Myślałem o użyciu bufora głębi do sortowania elementów - każdy nowy obiekt do rysowania będzie miał nieco wyższą pozycję Z. Pytanie brzmi, ile powinienem zwiększyć, aby nie wpaść w żadne problemy? AFAIK, mogą być dwa rodzaje problemów - jeśli sprawię, że będzie zbyt duży, to będę miał ograniczoną liczbę obiektów I można narysować w pojedynczej klatce, a jeśli zrobię to za małe, precyzyjna utrata bufora głębi może spowodować, że nakładające się obrazy będą rysowane w niewłaściwej kolejności.
1) Jakie powinny być wartości z przodu iz tyłu mojej projekcji ortograficznej? 0 do 1? -1 do 1? 1 do 2? Czy to ma znaczenie?
2) Jeśli używam „s nextafter () do zwiększania Zpozycję, na jakie problemy mogę wpaść? W jaki sposób OpenGL i bufor głębokości reagują na zmienne pływaki? Jeśli zacząłem od std :: numeric_limits :: min () i skończyłem na 1, czy powinienem się martwić o coś jeszcze?
Odpowiedzi:
4 dla odpowiedzi № 1Przede wszystkim musisz znać głębia bitowa twojego bufora głębi. Zwykle bufor głębokości jest stały, 16-, 24- lub 32-bitowy.
Biorąc pod uwagę bufor głębokości o stałym punkcie i domyślny zakres głębokości [0,1] możesz sprawić, aby każda wartość całkowita reprezentowała wyjątkowo wyraźną głębię za pomocą ortograficznej macierzy rzutowania z 0.0 dla nearVal
i:
- 16-bit:
farVal
= 65535.0 - 24-bit:
farVal
= 16777215.0 // Najczęstsza konfiguracja - 32-bit:
farVal
= 4294967295.0
Następnie możesz przypisać warstwowe sprite'y do farVal
+1- wiele różnych głębokości (zawsze używaj wartości całkowitej dla głębi sprite'a i zaczynaj od 0) i nie martw się, że bufor głębokości nie jest w stanie rozróżnić warstw. Innymi słowy, precyzja bufora głębokości dyktuje maksymalną liczbę warstw, które możesz mieć.