爲了模擬全球霧效,可以利用osgearth着色器合成實現,通過引入VirtualProgram屬性執行運行時着色器合成,實現覆蓋場景圖中較高位置的着色器。實現效果如圖1所示。
圖1 全球霧效
實現osgEarth全球霧效的關鍵代碼如下:
char s_hazeVertShader[] =
"#version " GLSL_VERSION_STR "\n"
"varying vec3 v_pos; \n"
"void setup_haze(inout vec4 VertexVIEW) \n"
"{ \n"
" v_pos = vec3(VertexVIEW); \n"
"} \n";
char s_hazeFragShader[] =
"#version " GLSL_VERSION_STR "\n"
"varying vec3 v_pos; \n"
"void apply_haze(inout vec4 color) \n"
"{ \n"
" float dist = clamp( length(v_pos)/1000.0, 0.0, 0.80 ); \n"
" color = mix(color, vec4(0.6, 0.6, 0.6, 1.0), dist); \n"
"} \n";
vp->setFunction( "setup_haze", s_hazeVertShader, osgEarth::ShaderComp::LOCATION_VERTEX_VIEW );
vp->setFunction( "apply_haze", s_hazeFragShader, osgEarth::ShaderComp::LOCATION_FRAGMENT_LIGHTING );