Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для уверенных пользователей
                Сортировка прозрачности

Сортировка прозрачности

Опубликованно: 01.05.2017, 12:27
Последняя редакция, Andry: 11.05.2017 20:32

Часто возникает путаница с тем, как обрабатываются пиксели относительно z-буфера и почему сортировка важна. Самое главное, что это может буквально сводить с ума, попытки осознать как «исправить» все в случае, когда правильная сортировка невозможна.

Надеюсь, эти диаграммы помогут показать бесполезность всего этого … Я имею в виду компромиссы, которые нужно сделать, чтобы прозрачность выглядела лучше всего в общем случае.

Первое изображение, которое я покажу, это «лучший случай», когда все объекты вытягиваются назад. Затем я кратко объясню шаги, которые предпримет JME, чтобы попытаться это осуществить.

Картинка 1

Непрозрачный слой нарисован, не Z-contention.

Картинка 2

Первый прозрачный слой нарисован, все еще не Z-contention.

Картинка 3

Второй прозрачный слой нарисован, все еще пор нет Z-contention.

Это лучший сценарий, все слои возвращаются в форму.


В JME непрозрачный слой обычно помещается в непрозрачный бакет(bucket). Все непрозрачные слои рисуются первыми и в пределах способности сортировать их, они сортируются спереди назад, чтобы предотвратить перерасход.

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


Сортировка выполняется на уровне объекта, и она никогда не может быть идеальной. Невозможно правильно сортировать объекты по расстоянию в общем случае, даже если они были только треугольниками. Просто представьте себе пересекающиеся треугольники, и ясно, что правильного порядка нет. JME старается изо всех сил.

Далее я покажу изображение худшего сценария, чтобы показать, почему сортировка важна и как ваш «лучший друг» z-буфер на самом деле является злейшим врагом прозрачности.

Картинка 1

Первый прозрачный слой нарисован, не Z-contention, и четырехугольник полностью заполняет Z-буфер.

Картинка 2

Второй прозрачный слой, оттянутый с Z-концом. Любой существующий «ближе»; Пиксели не перезаписываются.

У пикселей Transparet в A все еще есть цвет фона.

Похоже, вы можете «видеть» слой B.

Картинка 3

Последний непрозрачный слой, нарисованный с помощью Z-contention.

Этот пример является упорядочением наихудшего случая.


Это то, что произойдет, если вы поместите все ваши объекты в непрозрачный буфер. JME будет сортировать их спереди назад, и вы получите эти странные «окна» на свой задний план.

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

Наконец, я добавлю сортировку наихудшего случая с чем-то вроде alphaDiscardThreshold (или старыми значениями alphaTest / alphaFalloff). В этом примере давайте предположим, что мы отбрасываем пиксели только с альфа = 0.

Картинка 1

Первый прозрачный слой нарисованный, без Z-contention.

Полностью прозрачные пиксели отбрасываются. Z-буфера заполняются только нарисованные пиксели.

Картинка 2

Второй прозрачный слой, нарисованный с Z-contention. Любые «приближающиеся» пиксели не переписываются, но теперь это просто форма A и ее граница.

Примечание: прозрачная граница A кажется непрозрачной и смешивает фон, потому что Z-буфер был заполнен, иначе B полностью перезапишет границу.

Картинка 3

Последний непрозрачный слой с Z-contentio.

Примечание. Прозрачная рамка B имеет аналогичные проблемы с A.

Это наилучший вариант для сортировки в наихудшем случае.


Это лучше, но не идеально. Любые частично прозрачные пиксели будут по-прежнему показывать проблему. Частичная прозрачность сведет вас с ума, если вы позволите.

Итог:

  • Сортировка задом наперед будет устранять все проблемы
  • Точная сортировка задом наперед будет в общем случае невозможна
  • Для сугубо вкл/выкл прозрачности a = 1 или a = 0, наилучшим выбором для смягчения проблем сортировки является порог отбрасывания.
  • Где 0 < alpha < 1, неправильная сортировка треугольников/пикселей всегда будет вызывать дефект.

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.