/ / Używanie bufora głębi do układania ikonek 2D - c ++, opengl, zmiennoprzecinkowy, bufor głębokości

Używanie bufora głębi do nakładania warstw sprite 2D - c ++, opengl, zmiennoprzecinkowy, bufor głębi

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 № 1

Przede 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ć.