2013-03-06 6 views
2

Поймайте много для этого, прочитайте this very useful article, но все еще задаетесь вопросом о решении для моего проекта. Этот скриншот показывает моя проблема прекрасно:XNA/MonoGame: сортировка по глубине альфа-смеси UserPrimitives

Alpha Blend Problem

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

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

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

ответ

3

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

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

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

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

+0

Спасибо! Поэтому, я думаю, мне приходится сортировать объекты. Они действительно более или менее выпуклые, хотя я думаю, что использование отбраковки не поможет, потому что мои фигуры слишком простые и состоят из слишком мало треугольников, и в 99% случаев эти треугольники лишь частично видны. Я пойду на сортировку, мне все равно нужно выяснить, как (например, разбивать красный объект на 2), но я справимся. Любые советы или статьи очень приветствуются! – kapser

+0

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

+0

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