osgEarth全球霧效的實現解決方法

爲了模擬全球霧效,可以利用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 );

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章