1. OSG内置雾化类osg::Fog
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::Group> gp= new osg::Group;
gp->addChild(osgDB::readNodeFile("ceep.ive"));
osg::ref_ptr<osg::Fog> fog = new osg::Fog;
fog->setDensity(0.01);
fog->setColor(osg::Vec4(1.0, 1.0, 1.0, 1.0));
fog->setMode(osg::Fog::LINEAR); //osg::Fog::EXP //osg::Fog::EXP2
fog->setStart(10);
fog->setEnd(50);
gp->getOrCreateStateSet()->setAttributeAndModes(fog.get(), osg::StateAttribute::ON);
viewer->setSceneData(gp);
return viewer->run();
}
2. 着色器部分程序
下述过程中使用的内置一致变量的值都是由上述函数传递进来的!
//顶点着色器
varying vec2 Texcoord;
varying vec4 ecPosition;
void main( void )
{
ecPosition = gl_ModelViewMatrix * gl_Vertex;
gl_Position = ftransform();
Texcoord = gl_MultiTexCoord0.xy;
}
//片元着色器
uniform sampler2D baseMap;
varying vec2 Texcoord;
varying vec4 ecPosition;
const float LOG2E = 1.442695; // 1/ln2
void main(void)
{
vec4 color = texture2D(baseMap, Texcoord);
gl_FogFragCoord = abs(ecPosition.z);
//float fogFactor = (gl_Fog.end-gl_FogFragCoord) * gl_Fog.scale; //GL_LINEAR雾化
//float fogFactor = exp2(-gl_Fog.density * gl_FogFragCoord * LOG2E); //GL_EXP雾化
float fogFactor = exp2(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord * LOG2E); //GL_EXP2雾化
fogFactor = clamp(fogFactor, 0.0, 1.0); //将fogFactor钳位于[0.0, 1.0]
gl_FragColor = mix(gl_Fog.color, color, fogFactor);
}
补充:
- osg::Fog::LINEAR
- osg::Fog::EXP
- osg::Fog::EXP2
其中”f”为雾化因子,”z”为眼睛空间中z坐标的绝对值。