Использование буфера глубины для наложения 2D спрайтов

Я делаю 2D-игру, используя OpenGL. Я хочу сделать рисование следующим образом: сначала я копирую данные вершин всех объектов, которые я хочу нарисовать, в VBO (по одному VBO на текстуру / шейдер), затем рисую каждое VBO в отдельном вызове рисования. Это казалось хорошей идеей, пока я не понял, что это испортит порядок рисования — вызовы отрисовки не обязательно будут в порядке загрузки объектов в VBO. Я думал об использовании буфера глубины для сортировки элементов — каждый новый объект для рисования будет иметь немного более высокую позицию Z. Вопрос в том, насколько я должен увеличить его, чтобы не столкнуться с какими-либо проблемами? AFAIK, может быть два вида проблем — если я сделаю его слишком большим, то у меня будет ограниченное количество объектов, которые я могу нарисовать в одном кадре, и если я сделаю его слишком маленьким, потеря точности буфера глубины может привести к перекрывающиеся изображения должны быть нарисованы в неправильном порядке. Подвести итоги:

1) Какими должны быть передние и задние значения моей ортографической проекции? 0 к 1? -1 к 1? От 1 до 2? Это имеет значение?

2) Если я использую nextafter () для увеличения позиции Z, с какими проблемами я могу столкнуться? Как OpenGL и буфер глубины реагируют на субнормальные значения? Если я начал с std :: numeric_limits :: min () и закончил на 1, есть ли что-то еще, о чем мне следует беспокоиться?

3

Решение

Прежде всего, вам нужно знать битовой глубины вашего буфера глубины. Обычно буфер глубины является фиксированным, 16-, 24- или 32-битным.

Учитывая буфер глубины с фиксированной точкой и диапазон глубины по умолчанию [0,1] вы можете сделать каждое целочисленное значение, представляющее уникально различимую глубину, используя матрицу ортографической проекции с 0.0 за nearVal а также:

  • 16-бит:   farVal знак равно 65535,0
  • 24-бит:   farVal знак равно 16777215,0      // Самая распространенная конфигурация
  • 32-бит:   farVal знак равно +4294967295,0

Затем вы можете назначить свои слоистые спрайты до farVal+1-много разных глубин (всегда используйте целочисленное значение для глубины спрайта и начинайте с 0) и не беспокоиться о том, что буфер глубины не может различить слои. Другими словами, точность вашего буфера глубины будет определять максимальное количество слоев, которое вы можете иметь.

4

Другие решения


По вопросам рекламы [email protected]