Вулкан ожидает шейдеры SPIR-V (стандартное портативное промежуточное представление) .Только через расширения реализации Vulkan допускают другие входы для шейдеров.Группа Khronos предоставила компилятор GLSL -> SPIR-V, который вы можете либо встроить в свое приложение и скомпилировать во время выполнения, либо предварительно скомпилировать при сборке и поставке с вашим приложением.Этот компилятор поставляется с LunarGSDK.Использование компилятора glslang описано в Учебном пособии по Vulkan здесь .Вы можете скомпилировать с помощью команды:
/path/to/glsllanvalidator/glslangValidator.exe -V shader.frag
Я считаю, что вы должны использовать правильное расширение файла (.frag, .vert. .Comp и т.д .., которое не использовалось в OpenGL), чтобы компилятор распозналшейдер.Более подробную информацию о автономном компиляторе можно найти здесь .Используя этот метод, вы запустите glslangValidator
как часть вашего шага сборки.
Чтобы встроить компилятор в ваше приложение, вы можете использовать ресурсы, найденные в этом ответе , и использовать вспомогательные библиотеки, такие как shaderc , или вы можете встроить его самостоятельно, используя glslang напрямую .
SPIR-V - это язык низкого уровня, подобный языку, который представлен двоичным файлом, предоставленным драйверу vulkan.Затем драйвер может JIT скомпилировать шейдер , что позволит вам иметь один и тот же код шейдера, независимо от драйвера vulkan.Отличие состоит в том, что драйвер не обязан выполнять все необходимые этапы компиляции, если ему было предоставлено удобочитаемое текстовое представление кода. Драйвер должен понимать только это представление сборки низкого уровня.Это позволяет разработчику использовать любой языковой интерфейс, который компилируется в SPIR-V (который теперь включает HLSL ).Как дополнительное преимущество, это устраняет огромные накладные расходы драйвера, что уменьшает основной источник ошибок для сопровождающего драйвера, и означает, что вам не нужно хранить программы в виде простого текста, который может быть легко извлечен при публикации приложения.,