2D-движок с OpenGL: использовать Z-буфер или собственную реализацию для сортировки спрайтов?

Если бы я делал 3D-движок, ответ на этот вопрос был бы ясен: я бы использовал буфер глубины вместо того, чтобы думать о сортировке всех моих полигонов самостоятельно.

Однако с 2D ситуация иная, потому что здесь слои можно легко реализовать без помощи OpenGL — и тогда вы даже можете сортировать и перемещать спрайты внутри слоев. (Что невозможно в OpenGL afaik)

  • (Почему) я должен использовать буфер глубины OpenGL вместо системы слоев C++, работающей на ЦП?
  • Насколько медленнее будет версия с буфером глубины?

Мне ясно, что создание системы слоев на C++ почти не повлияет на производительность, так как мне в любом случае приходится перебирать спрайты для рендеринга.


person KLa    schedule 07.04.2011    source источник
comment
Я думаю, все зависит от вас... Я выбрал рендеринг своих собственных слоев на простом C++ при создании механизма прокрутки 2D-тайлов в DirectX. Однако мои спрайты также состояли из одной текстуры (другими словами, тени были встроены в кадр, у меня было только 2 слоя тайлов и спрайтов).   -  person AJG85    schedule 07.04.2011


Ответы (3)


Я бы посоветовал вам сделать это в программном обеспечении, поскольку вы, вероятно, хотите использовать прозрачность своих спрайтов, а это означает, что вы визуализируете их сзади наперед. Также сортировка пары спрайтов не должна сильно нагружать процессор.

person tibur    schedule 07.04.2011

Используйте оба, если можете.

Информация о глубине хороша для постобработки и таких вещей, как 3D-очки, так что не стоит ее выбрасывать. Такие эффекты могут быть очень хороши для 2D-игр. Кроме того, если вы рисуете свои (непрозрачные) слои спереди назад, вы можете сэкономить скорость заполнения, потому что Z-буфер может сделать отсечение за вас (тесты глубины быстрее, чем фактическое рисование). Тестирование глубины обычно почти бесплатно, особенно если вы получили иерархическую Z-информацию. Из-за этого и экономии скорости заполнения использование глубинного тестирования, вероятно, будет еще быстрее.

С другой стороны, программная сортировка удобна, так что вы действительно можете выполнять рендеринг спереди назад для непрозрачных спрайтов, и обязательно правильно выполнять альфа-смешивание (конечно, вы рисуете эти спрайты сзади наперед).

person ltjax    schedule 07.04.2011

Прямые ответы:

  • разрешение GPU использовать буфер глубины позволит вам динамически настраивать порядок прорисовки вещей без какой-либо перетасовки на CPU и избавит вас от необходимости назначать вещи на разные слои в ситуациях, когда это немного фантастика — для например, у вас могут быть такие эффекты, как снаряды, которые летят из фона к игроку, а затем перед ним, без необходимости постоянно выяснять, на какой слой их назначать.
  • на графическом процессоре использование глубины не будет иметь ощутимого эффекта, даже если вы используете встроенный чип, подключаемую карту более десяти лет назад или интегрированную часть; они настолько фундаментальны для современных графических процессоров, что были оптимизированы до нуля с практической точки зрения.

Однако я полагаю, что вы действительно хотите сделать это на ЦП по простой причине правильной обработки прозрачности. Буфер глубины хранит одну глубину на пиксель, поэтому, если вы рисуете почти прозрачный объект, а затем пытаетесь нарисовать что-то за ним, то это не будет нарисовано, даже если оно должно быть видимым. В 2D-игре вполне вероятно, что сглаживание сделает края ваших спрайтов частично прозрачными; если вы отправляете рисунок на графический процессор в порядке отрисовки, ваши частичные прозрачности всегда будут скомпонованы правильно. Если вы оставите для этого z-буфер, вы рискуете получить странную окантовку.

person Tommy    schedule 07.04.2011