Оптимальный способ рисования сцен друг на друге - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь нарисовать сцены друг над другом, мой способ сделать это в OpenGL - нарисовать каждую сцену, затем очистить трафарет глубины и затем нарисовать следующую сцену.

Для Вулкана мира, если мы хотим перевести мой предыдущий путь, я должен запустить проход рендеринга, затем нарисовать каждую сцену и затем очистить трафарет глубины (vkCmdClearAttachments), а затем нарисовать следующийСцена и конец рендеринга.Но у меня возникает несколько вопросов:

  • Есть ли лучшая стратегия для этого?(например, запуск прохода нового рендеринга для каждой сцены.)
  • Я нашел vkCmdClearAttachments, но я не уверен, что он нуждается в синхронизации с предыдущими и последующими командами или нет?

1 Ответ

0 голосов
/ 28 сентября 2018

«Оптимальный» способ сделать это, будь то в Vulkan или OpenGL, состоит в том, чтобы разделить ваш буфер глубины на две области: по одной для каждой сцены.Вы используете преобразование области просмотра для разделения буфера глубины.Одна сцена получит диапазон [0,5, 1], а следующая - диапазон [0, 0,5].glDepthRange - это то, что вы использовали бы для установки этого в OpenGL, а поля min/maxDepth VkViewport обрабатывают аналогичное преобразование в Vulkan.

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

...