如何使用glslang
How to use glslang
我正在尝试使用 glslang 将 glsl 着色器代码编译为 SPIR-V 二进制文件。
可以在这里找到 glslang 项目:
https://github.com/KhronosGroup/glslang
通过在命令行中手动 glslangValidator.exe 效果很好。
但是我想使用c++接口。
我已经按照 github 页面上的描述构建了项目,现在我正在为如何实际使用界面而苦恼。
我宁愿不在我的解决方案中实际包含任何项目(我正在使用 Visual Studio),但是 link .lib 和 headers 需要使用它。
我就是找不到我需要哪些 link。 github页面只提到了ShaderLang.h和StandAlone.cpp,这是不够的。
谁能解释一下如何设置可以使用 glslang 的项目?我只需要它来将 glsl 着色器代码编译为 SPIR-V 二进制文件(带有有关着色器编译的调试信息)。
我想对于已经做过或有更多经验的人来说,这将是一个非常简单的问题。
您需要使用几个库。要查看的示例消费者是 LunarGLASS:https://github.com/LunarG/LunarGLASS。在那里,您可以看到文件:
https://github.com/LunarG/LunarGLASS/blob/master/CMakeLists.txt
其中包含以下库的内容:
set(GLSLANGLIBS
glslang
HLSL
OSDependent
OGLCompiler
SPIRV)
glslang 的自述文件包含一些重要信息。此外,在 glslang 中,glslangValidator 工具(基本上是 StandAlone.cpp)展示了如何为库使用 API。 LunarGLASS项目中的Frontends/glslang目录也可以看到类似的用途。
位于 https://github.com/google/shaderc 的 Shaderc 项目提供了一个易于使用的 C++ API,它将 Glslang 的编译器封装到 SPIR-V。
用法示例,参见https://github.com/google/shaderc/blob/master/examples/online-compile/main.cc
您可以使用 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 blob 可以通过以下方式与 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 );
我正在尝试使用 glslang 将 glsl 着色器代码编译为 SPIR-V 二进制文件。 可以在这里找到 glslang 项目:
https://github.com/KhronosGroup/glslang
通过在命令行中手动 glslangValidator.exe 效果很好。 但是我想使用c++接口。
我已经按照 github 页面上的描述构建了项目,现在我正在为如何实际使用界面而苦恼。
我宁愿不在我的解决方案中实际包含任何项目(我正在使用 Visual Studio),但是 link .lib 和 headers 需要使用它。 我就是找不到我需要哪些 link。 github页面只提到了ShaderLang.h和StandAlone.cpp,这是不够的。
谁能解释一下如何设置可以使用 glslang 的项目?我只需要它来将 glsl 着色器代码编译为 SPIR-V 二进制文件(带有有关着色器编译的调试信息)。 我想对于已经做过或有更多经验的人来说,这将是一个非常简单的问题。
您需要使用几个库。要查看的示例消费者是 LunarGLASS:https://github.com/LunarG/LunarGLASS。在那里,您可以看到文件:
https://github.com/LunarG/LunarGLASS/blob/master/CMakeLists.txt
其中包含以下库的内容:
set(GLSLANGLIBS
glslang
HLSL
OSDependent
OGLCompiler
SPIRV)
glslang 的自述文件包含一些重要信息。此外,在 glslang 中,glslangValidator 工具(基本上是 StandAlone.cpp)展示了如何为库使用 API。 LunarGLASS项目中的Frontends/glslang目录也可以看到类似的用途。
位于 https://github.com/google/shaderc 的 Shaderc 项目提供了一个易于使用的 C++ API,它将 Glslang 的编译器封装到 SPIR-V。
用法示例,参见https://github.com/google/shaderc/blob/master/examples/online-compile/main.cc
您可以使用 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 blob 可以通过以下方式与 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 );