Проблемы с буфером глубины и альфа в XNA

Я показываю много случаев BasicEffectкаждая из которых представляет собой "пластину" с произвольно выбранной из четырех текстур: частично прозрачной или полностью непрозрачной.

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

Трудно объяснить, как все отображается, вот изображение.

Есть ли решение проще, чем рендеринг в правильном для него порядке?

1 ответ

Решение

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

В результате буфер глубины не работает должным образом с прозрачными пикселями. Прозрачный пиксель может привести только к частичному изменению цветового буфера, но он полностью заменяет значение в буфере глубины. Нет возможности рисовать "под".

Есть два способа решения этой проблемы:

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

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

Другие вопросы по тегам