OSG雾效

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坐标的绝对值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值