Проблема XNA Render с несколькими альфа-каналами

У меня возникла проблема с попыткой отобразить несколько альфа-объектов друг над другом. На данный момент, если я визуализирую один альфа-объект поверх другого альфа-объекта, отображается верхний альфа-объект, а нижний объект не отображается, пока вы не пройдете/обогните первый объект. Я пытаюсь получить дополнительный эффект смешивания, поэтому верхний объект показывает, что за ним есть другой прозрачный объект. Как вы делаете это в XNA?? Мои текущие настройки состояния рендеринга:

RenderState rs = Globals.g_Device.RenderState;
rs.AlphaBlendEnable = true;
rs.BlendFunction = BlendFunction.Add;
rs.DepthBufferFunction = CompareFunction.LessEqual;
rs.DepthBufferEnable = true;
rs.DepthBufferWriteEnable = true;
Globals.g_Device.PresentationParameters.EnableAutoDepthStencil = true;
Globals.g_Device.PresentationParameters.AutoDepthStencilFormat =     DepthFormat.Depth24Stencil8;

person Ice Phoenix    schedule 14.03.2011    source источник


Ответы (1)


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

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

Вот общий процесс рендеринга сцены, содержащей прозрачные объекты:

  • Нарисуйте непрозрачные объекты в вашей сцене с включенными чтением и записью глубины.

  • Сортируйте прозрачные объекты сзади наперед.

  • Нарисуйте отсортированные прозрачные объекты с включенным чтением глубины.

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

person Andrew Russell    schedule 14.03.2011