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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 07 апреля 2011

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

5 голосов
/ 07 апреля 2011

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

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

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

3 голосов
/ 07 апреля 2011

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

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

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

...