shader預(yù)編譯為二進(jìn)制,在程序運(yùn)行時(shí)候加載,可以提升性能,節(jié)省啟動(dòng)時(shí)間.
1. 采用google shaderc預(yù)編譯與加載shader
1.1 下載代碼 https://github.com/google/shaderc
third_party文件里需要放依賴(lài)的第三方
因?yàn)殡娔X訪問(wèn)google的問(wèn)題,無(wú)法通過(guò)shaderc-2023.4\utils\git-sync-deps
腳本自動(dòng)下載第三方,手動(dòng)下載
https://codeload.github.com/KhronosGroup/SPIRV-Tools/zip/refs/tags/v2023.3.rc1
https://codeload.github.com/KhronosGroup/SPIRV-Headers/zip/refs/tags/sdk-1.3.250.1
https://codeload.github.com/KhronosGroup/glslang/zip/refs/tags/sdk-1.3.250.1
1.2 配置
用CMake (cmake-gui)構(gòu)建shaderc,生成vs工程
別忘了配置第三方庫(kù)目錄
1.3 編譯
vs編譯shaderc,得到頭文件和庫(kù)
所有的庫(kù)都是MDD的動(dòng)態(tài)庫(kù)
2. 在引擎里引入shaderc
2.1 在CmakeLists.txt增加頭文件和庫(kù)
shaderc提供了兩種方式引用,
- 直接用libshaderc_combined,這是一個(gè)靜態(tài)庫(kù)
- 用glslang, OSDependent, OGLCompiler,shaderc_util, SPIRV, HLSL, SPIRV-Tools, and SPIRV-Tools-opt.
2.2 源碼修改
在openGLShader.cpp
里CompileOrGetOpenGLBinaries
會(huì)判斷是否有cache文件,沒(méi)有就生成shader bin文件,有就加載bin文件.
shaderc::SpvCompilationResult module = compiler.CompileGlslToSpv(source_text, Utils::GLShaderStageToShaderC(stage), m_FilePath.c_str(), options);
CreateProgram
會(huì)根據(jù)bin文件創(chuàng)建shader,跳過(guò)了編譯的過(guò)程.文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-536353.html
glShaderBinary(1, &shaderID, GL_SHADER_BINARY_FORMAT_SPIR_V, spirv.data(), spirv.size() * sizeof(uint32_t));
glSpecializeShader(shaderID, "main", 0, nullptr, nullptr);
glAttachShader(program, shaderID);
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-536353.html
3. 性能
- 直接編譯shader代碼的方式,每個(gè)shader消耗20ms
- 初次編譯shader生成bin文件的方式,每個(gè)shader消耗2000ms
- 直接加載shader bin文件的方式,每個(gè)shader消耗5ms
到了這里,關(guān)于自制游戲引擎之shader預(yù)編譯的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!