最近在學習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