#c# #3d #alphablending #slimdx #alpha-transparency
#c# #3D #Перенос букв #slimdx #альфа-прозрачность
Вопрос:
У меня есть тестовое приложение с включенной прозрачностью, достигнутой с помощью альфа-смешивания. Приложение построено на C # с использованием SlimDX. Однако на одном из моих объектов, к которому применено альфа-смешивание, я получаю странный эффект «отсутствующего треугольника» (см. Ниже).
Объект представляет собой почти цилиндр.
Мне было интересно, сможет ли кто-нибудь, более опытный в компьютерной графике 3D и / или использовании альфа-смешивания, указать мне правильное направление, чтобы я мог понять этот результат — и, надеюсь, удалить его.
Редактировать
Я попытался использовать шейдер, не зависящий от порядка, и я получаю тот же результат. Может показаться, что пиксели / фрагменты отбрасываются из-за провала теста глубины. Для меня это не имеет никакого смысла.
Ответ №1:
Вам нужно выбрать функцию смешивания, которая не зависит от порядка, или попытаться отсортировать треугольники вдоль оси вида (что невозможно). Посмотрите, почему здесь.
Редактировать:
Проблема в том, что буфер Z не позволяет OpenGL рисовать пиксели, которые находятся за объектами, которые уже были нарисованы. Как правило, это довольно удобно, но когда объект впереди полупрозрачен, вам нужно видеть то, что находится за ним.
Чтобы получить правильную геометрию:
- Переведите буфер глубины в режим только для чтения.
- Выберите функцию наложения, не зависящую от порядка.
Комментарии:
1. Невозможно, вы говорите? Вы никогда не использовали видеокарту PowerVR?
2. Невозможно на обычном оборудовании. Графические карты PowerVR хранят список треугольников для каждого фрагмента.
3. Смешивание отлично работает на других моделях, которые я визуализирую, это только эта. Я отлаживал его в PIX, и в нем указано, что пиксели были отброшены, поскольку они не прошли проверку глубины.
4. Я еще немного отладил в PIX (перед внесением изменений), и я перестал получать сообщение об ошибке проверки глубины (не уверен, почему). Я также только что обнаружил, что установка SrcBlend на SrcAlpha (как у меня было) и DestBlend на DestAlpha (это была InvSrcAlpha) и предоставление ZBuffer доступа только для чтения устраняет мою проблему с отсутствующим фрагментом. Я этого не понимаю, и я не думаю, что это работает как идеальное решение, поскольку теперь у меня местами довольно яркое смешивание.
5. Мне наконец (более или менее) удалось найти решение возникшей у меня проблемы. На момент публикации этого вопроса я не до конца понимал проблему. Однако, благодаря этому сообщению и подборке статей и форумов с тех пор, я узнал, что вы были правы, подчеркнув, что треугольники были в неправильном порядке. Таким образом, реализация независимого от порядка алгоритма прозрачности была единственным возможным решением. Спасибо за ответ.