关于Vulkan应用程序运行时编译GLSL Shader文件的方法
最近在学习Vulkan,在相关参考书中给出的示例代码因为使用的VulkanSDK较老,出现无法构建成功的问题。而且示例代码给出的Vulkan应用程序运行时编译GLSL Shader文件的方法放在现在已经是非常的麻烦。现在新版的VulkanSDK(1.3.X以上)将GLSL编译为SPIR-Vj就非常方便了,可以使用Google提供的ShaderC库来的编译:
//头文件导入
#include <shaderc/shaderc.hpp>//这个头文件位于VulkanSDK的Include文件夹内
#include <span>
//在构建着色器模块的相关函数内:
//实例化一个编译器对象
shaderc::Compiler compiler;
//编译顶点着色器,参数分别是着色器代码字符串,着色器类型,文件名
auto vertResult = compiler.CompileGlslToSpv(FileUtil::loadAssetStr(vs), shaderc_glsl_default_vertex_shader, vs);
auto errorInfo=vertResult.GetErrorMessage();
//可以加判断,如果有错误信息(errorInfo!=""),就抛出异常
std::cout<<errorInfo;
std::span<const uint32_t> vert_spv = {vertResult.begin(), size_t(vertResult.end() - vertResult.begin()) * 4};
//填充着色器模块创建信息结构体
VkShaderModuleCreateInfo moduleCreateInfo;// 准备顶点着色器模块创建信息
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = nullptr;// 自定义数据的指针
moduleCreateInfo.flags = 0;
moduleCreateInfo.codeSize = vert_spv.size();// 顶点着色器SPV数据总字节数
moduleCreateInfo.pCode = vert_spv.data(); // 顶点着色器SPV数据
链接shaderc_shared.lib库文件(这里使用CMake,其他构建工具同理)
target_link_libraries({VULKAN_SDK}/Lib/shaderc_shared.lib)
附上一个在Vulkan中实践图形学的代码仓:gitee.com/Ruemo/vulkan-book-code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步