为什么要使用Shaders.cpp.in(还有MPShaders.cpp.in SimpleSkyShaders.cpp.in SplatShaders.cpp.in DetailShaders.cpp.in)?主要是为了实现shader的单独成文件,不用硬编码到cpp文件中。
借助CMake对Shaders.cpp.in进行处理,重新生成cpp文件,从而将shader文件编码到这个新cpp中。
CMake的处理过程如下:
1、在CMakeLists.txt中添加
configure_shaders(
Shaders.cpp.in
${SHADERS_CPP}
${TARGET_GLSL} )
2、OsgEarthMacroUtils.cmake中定义了configure_shaders
对shaders.cpp.in的处理由此宏完成,最终会将shader代码编码进一个新生成的cpp文件AutoGenShaders.cpp中
configure_file(
${source_dir}/${template_file}
${output_cpp_file}
@ONLY )
以上主要完成着色器代码的替换
3、替换shader中的版本号和精度
osgEarth/ShaderLoader.cpp
std::string
ShaderLoader::load(const std::string& filename,
const ShaderPackage& package,
const osgDB::Options* dbOptions)
{
osgEarth::replaceIn(output, "$GLSL_VERSION_STR", GLSL_VERSION_STR);
osgEarth::replaceIn(output, "$GLSL_DEFAULT_PRECISION_FLOAT", GLSL_DEFAULT_PRECISION_FLOAT);
}