最近在学习Vulkan,在相关参考书中给出的示例代码因为使用的VulkanSDK较老,出现无法构建成功的问题。而且示例代码给出的Vulkan应用程序运行时编译GLSL Shader文件的方法放在现在已经是非常的麻烦。现在新版的VulkanSDK(1.3.X以上)将GLSL编译为SPIR-V非常方便了,可以使用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
标签:GLSL,moduleCreateInfo,vertResult,程序运行,Shader,编译,Vulkan,着色器 From: https://www.cnblogs.com/IRuemoI/p/18544741