XNA / MonoGame: глубинная сортировка Альфа-смешанных пользователей
Погуглившись вокруг много для этого, прочитайте эту очень полезную статью, но все еще задаваясь вопросом о решении для моего проекта. Этот скриншот прекрасно иллюстрирует мою проблему:
Есть 2 объекта: красный объект, который состоит из 2 квадратиков, один с Z-индексом -1, а другой с z-индексом 1. Оба квадрата имеютColor.Red * 0.5f
. Сначала рисуется. Другой объект-игрок с Z-индексом 0. Рисуется второй
Потому что я хочу, чтобы игрок перешел между квадратиками я установил DepthStencilState
в DepthStencilState.Default;
, но это дает следующее изображение. Пиксели игрока игнорируются, потому что перед ними находится объект.
Я пакую все мои примитивы в один большой DrawUserPrimitive, основанный на этом классе. Как лучше всего решить эту проблему? Должен ли я сортировать треугольник на основе z-индекса (и как бы я это сделал; это дорого?) или есть другое решение?
1 ответ:
Вы просто должны делать именно то, что говорится в этой статье. Вот инструкции, перечисленные как "наиболее распространенный подход", обновленный для XNA 4:
- Set
GraphicsDevice.DepthStencilState = DepthStencilState.Default
- нарисуйте всю непрозрачную геометрию
- множество
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
- сортируйте Альфа-смешанные объекты по расстоянию от камеры, затем рисуйте их в порядке от начала до конца
Если ваши прозрачные объекты более или менее выпуклы, то вам не нужно сортировать треугольники - только сами объекты-до тех пор, пока вы используете
Причина, по которой вы должны это сделать, заключается в том, что буфер глубины может хранить только одно значение - это значение самого верхнего пикселя. Нет никакого понятия о рисовании "под" этой глубиной. Данные, которые потребуются для этого (цвета объектов, нарисованных выше и ниже этого Z-индекса, в этом пикселе), уже смешаны с окончательным изображением и не могут быть извлечены.RasterizerState.CullCounterClockwise
(то есть: backface culling, по умолчанию).