Как использовать глсланг

Я пытаюсь использовать glslang для компиляции кода шейдера glsl в двоичные файлы SPIR-V. Проект glslang можно найти здесь:

https://github.com/KhronosGroup/glslang

Он хорошо работает через glslangValidator.exe вручную в командной строке. Но я хотел бы использовать интерфейс С++.

Я построил проект, как описано на странице github, и теперь я борюсь с тем, как на самом деле использовать интерфейс.

Я бы предпочел не включать какие-либо проекты в свое решение (я использую Visual Studio), а связать .lib и заголовки, необходимые для его использования. Я просто не могу найти, какие из них мне нужно связать. На странице github упоминаются только ShaderLang.h и StandAlone.cpp, чего недостаточно.

Может кто-нибудь объяснить, как настроить проект, в котором вы можете использовать glslang? Мне это нужно только для компиляции кода glsl-шейдера в бинарники SPIR-V (с отладочной информацией о компиляции шейдера). Я полагаю, это будет очень простой вопрос для тех, кто уже сделал это или имеет больше опыта.


person Aedoro    schedule 06.07.2016    source источник


Ответы (3)


Есть несколько библиотек, которые вам нужно использовать. Примером, на который стоит обратить внимание потребителю, является LunarGLASS: https://github.com/LunarG/LunarGLASS. Там вы можете увидеть файл:

https://github.com/LunarG/LunarGLASS/blob/master/CMakeLists.txt

Что внутри содержит это для библиотек:

set(GLSLANGLIBS
    glslang
    HLSL
    OSDependent
    OGLCompiler
    SPIRV)

В файле readme для glslang содержится важная информация. Кроме того, в glslang инструмент glslangValidator (в основном StandAlone.cpp) показывает, как использовать API для библиотек. Вы также можете увидеть каталог Frontends/glslang в проекте LunarGLASS для аналогичного использования.

person johnkslang    schedule 08.07.2016
comment
Спасибо за помощь, что-то вроде этого будет правильной настройкой? i.gyazo.com/3fbe9a06d1bf536222f2204d317b8321.png. (Это более четко видно для вас, если я использую прагма-библиотеки и полные включения, подобные этому. Очевидно, что настройки проекта необходимо отредактировать с включенными каталогами и библиотекой) - person Aedoro; 09.07.2016
comment
Выглядит хорошо; очевидно, зависит от того, соответствует ли ваша среда этому. Если это связывает и работает, я думаю, что Вы хороши. - person johnkslang; 11.07.2016

Проект Shaderc на https://github.com/google/shaderc предоставляет простой в использовании C++ API, который оборачивает компилятор Glslang в SPIR-V.

Пример использования см. на странице https://github.com/google/shaderc/blob/master/examples/online-compile/main.cc

person David Neto    schedule 30.08.2016
comment
Этот ответ полностью зависит от содержания внешних ссылок. Если они когда-нибудь станут недействительными, ваш ответ будет бесполезен. Поэтому, пожалуйста, отредактируйте свой ответ и добавьте хотя бы краткое изложение того, что там можно найти. Благодарю вас! - person Fabio says Reinstate Monica; 30.08.2016

Вы можете использовать интерфейс glslang C (https://github.com/KhronosGroup/glslang/pull/2038), чтобы скомпилировать исходный код шейдера в SPIR-V следующим образом.

const char* shaderCodeVertex = ...;

const glslang_input_t input =
{
    .language = GLSLANG_SOURCE_GLSL,
    .stage = GLSLANG_STAGE_VERTEX,
    .client = GLSLANG_CLIENT_VULKAN,
    .client_version = GLSLANG_TARGET_VULKAN_1_1,
    .target_language = GLSLANG_TARGET_SPV,
    .target_language_version = GLSLANG_TARGET_SPV_1_3,
    .code = shaderCodeVertex,
    .default_version = 100,
    .default_profile = GLSLANG_NO_PROFILE,
    .force_default_version_and_profile = false,
    .forward_compatible = false,
    .messages = GLSLANG_MSG_DEFAULT_BIT,
};

glslang_initialize_process();

glslang_shader_t* shader = glslang_shader_create( &input );

if ( !glslang_shader_preprocess(shader, &input) )
{
    // use glslang_shader_get_info_log() and glslang_shader_get_info_debug_log()
}

if ( !glslang_shader_parse(shader, &input) )
{
    // use glslang_shader_get_info_log() and glslang_shader_get_info_debug_log()
}

glslang_program_t* program = glslang_program_create();
glslang_program_add_shader( program, shader );

if (!glslang_program_link(program, GLSLANG_MSG_SPV_RULES_BIT | GLSLANG_MSG_VULKAN_RULES_BIT))
{
    // use glslang_program_get_info_log() and glslang_program_get_info_debug_log();
}

glslang_program_SPIRV_generate( program, input.stage );

if ( glslang_program_SPIRV_get_messages(program) )
{
    printf("%s", glslang_program_SPIRV_get_messages(program));
}

glslang_shader_delete( shader );

Скомпилированный большой двоичный объект SPIR-V можно использовать с Vulkan следующим образом.

const VkShaderModuleCreateInfo ci =
{
    .sType    = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
    .codeSize = glslang_program_SPIRV_get_size(program) * sizeof(unsigned int),
    .pCode    = glslang_program_SPIRV_get_ptr(program)
};

VkResult result = vkCreateShaderModule(device, &ci, nullptr, ...);

glslang_program_delete( program );
person Sergey K.    schedule 24.01.2020