Почему при визуализации модели с использованием Vulkan появляются прозрачные артефакты? - PullRequest
0 голосов
/ 26 апреля 2020

Я загрузил модель с помощью tinyobjloader в приложении Vulkan. Цвет каждой вершины просто равен ее трехмерной позиции. Используя RenderDo c, я убедился, что буфер глубины работает правильно:

enter image description here

Но на выходе цвета отображаются некоторые странные артефакты, в которых вы видите вершины, которые окклюзия:

enter image description here

Так выглядят артефакты при использовании фонарного освещения:

enter image description here

  • Правильная ориентация лица и выбраковка
  • Я пробовал оба формата изображения: SRGB и SFLOAT, оба дают одинаковые результаты
  • Я не переношу макеты в явном виде (и, следовательно, не меняйте маски доступа, используя VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT), но пусть подпрограммы позаботятся об этом

Поскольку код Vulkan обычно очень длинный, у меня очень длинный 1030 1031 *, так что вы можете посмотреть на основной код приложения. Дайте мне знать, если вам нужно увидеть больше.

1 Ответ

1 голос
/ 26 апреля 2020

Смешивание цветов является зависимой от порядка операцией и поэтому сложно использовать с буферизацией глубины.

Ваш код:

vk::PipelineColorBlendAttachmentState colorBlendAttachment(true,
vk::BlendFactor::eSrcColor, vk::BlendFactor::eOneMinusSrcColor,
vk::BlendOp::eAdd,
vk::BlendFactor::eOne, vk::BlendFactor::eZero,
vk::BlendOp::eAdd,

Примитивы (треугольники) обрабатываются в порядке примитивов. Здесь, в частности, треугольник, который находится первым в вашем индексном буфере, будет обработан первым.

Теперь, когда тестирование глубины работает, фрагмент продолжается, если он проходит тест глубины. Это означает, что один фрагмент может быть успешным. Тогда другой фрагмент с еще лучшим значением глубины может перезаписать его.

Это влияет на ваше значение Dst blend. В вашем случае это будет либо чистый цвет, либо предыдущий цвет фрагмента, в зависимости от того, что произойдет раньше, в порядке примитивов.

Операция смешивания - srcColor * srcColor + dstColor * (1-srcColor). Если ваш предыдущий цвет - 0, то в результате получается 2*srcColor, что, вероятно, не имеет смысла, но не заметно. Но если dstColor является чем-то, то ваш результат становится ярким цветом артефакта с большим количеством оттенка Dst.

...