В Vulkan, похоже, отсутствует условие для переключения между шейдерными программами.
Ближайший аналог glUseProgram
в Vulkan - vkCmdBindPipeline
,
Основное отличие состоит в том, что большая часть того, что считается частью конечного автомата OpenGL, запекается в объект конвейера Vulkan.Так, например, в то время как в OpenGL вы можете вызвать glUseProgram
, визуализировать некоторый контент, затем вызвать glDisable(GL_DEPTH_TEST)
и сделать еще несколько, в Vulkan это будут два разных конвейера, и для каждого из них потребуется вызов vkCmdBindPipeline
.
Если вы знакомы с vkCmdBindPipeline
и ищете какой-либо способ изменить какие шейдеры, краткий ответ: вы не можете этого сделать.Вам необходимо создать полный объект VkPipeline для каждого набора шейдеров, который вам нужно использовать, даже если ни одно из других значений в конвейере не отличается.
Однако, если вы обеспокоены тем, что в конечном итоге создадите огромное количество конвейеров и это повлияет на вашу производительность, вам следует изучить использование кэшей конвейера и флаг VK_PIPELINE_CREATE_DERIVATIVE_BIT, который позволяетвам создать что-то вроде дочерних конвейеров из шаблона конвейера.Это должно привести к той же или лучшей производительности, что и у OpenGL.
РЕДАКТИРОВАТЬ:
Имейте в виду, что разработчики, пытающиеся улучшить производительность создания конвейера, должны использовать обоих функциональность VkPipelineCache
и VK_PIPELINE_CREATE_DERIVATIVE_BIT
.Степень полезности производных конвейеров полностью зависит от драйвера, а некоторые драйверы (например, драйвер ARM MALI ) явно задокументированы как игнорирующие этот флаг.Спецификация Vulkan не дает никаких указаний относительно того, когда использовать или не использовать производный флаг.Надлежащий подход, вероятно, заключается в том, чтобы либо напрямую работать с независимыми поставщиками программного обеспечения, чтобы выяснить, как лучше всего применять его, либо использовать его всегда в надежде, что это улучшит производительность там, где это может, и не повлияет на производительность, в противном случае, либо просто не использовать производные вообще.,
Функциональность конвейерного кэша, с другой стороны, почти наверняка сократит время создания конвейера на широком спектре оборудования.