XNA / MonoGame: глубинная сортировка Альфа-смешанных пользователей


Погуглившись вокруг много для этого, прочитайте эту очень полезную статью, но все еще задаваясь вопросом о решении для моего проекта. Этот скриншот прекрасно иллюстрирует мою проблему:

Проблема Альфа-Смеси

Есть 2 объекта: красный объект, который состоит из 2 квадратиков, один с Z-индексом -1, а другой с z-индексом 1. Оба квадрата имеют Color.Red * 0.5f. Сначала рисуется. Другой объект-игрок с Z-индексом 0. Рисуется второй

Потому что я хочу, чтобы игрок перешел между квадратиками я установил DepthStencilState в DepthStencilState.Default;, но это дает следующее изображение. Пиксели игрока игнорируются, потому что перед ними находится объект.

Я пакую все мои примитивы в один большой DrawUserPrimitive, основанный на этом классе. Как лучше всего решить эту проблему? Должен ли я сортировать треугольник на основе z-индекса (и как бы я это сделал; это дорого?) или есть другое решение?

1 2

1 ответ:

Вы просто должны делать именно то, что говорится в этой статье. Вот инструкции, перечисленные как "наиболее распространенный подход", обновленный для XNA 4:

  1. Set GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. нарисуйте всю непрозрачную геометрию
  3. множество GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. сортируйте Альфа-смешанные объекты по расстоянию от камеры, затем рисуйте их в порядке от начала до конца

Если ваши прозрачные объекты более или менее выпуклы, то вам не нужно сортировать треугольники - только сами объекты-до тех пор, пока вы используете RasterizerState.CullCounterClockwise (то есть: backface culling, по умолчанию).

Причина, по которой вы должны это сделать, заключается в том, что буфер глубины может хранить только одно значение - это значение самого верхнего пикселя. Нет никакого понятия о рисовании "под" этой глубиной. Данные, которые потребуются для этого (цвета объектов, нарисованных выше и ниже этого Z-индекса, в этом пикселе), уже смешаны с окончательным изображением и не могут быть извлечены.