• OSG描边特效osgFX::Outline的修改


    对一个三维场景中的物体实现描边特效,可以参考osg范例osgoutline

    这个描边特效使用了模板缓存Stencil来实现,参见源代码osgFX/Outline.cpp

    使用了两个Pass

    第一个Pass绘制第一遍模型,将模型覆盖的模版区域写入值1

    第二个Pass绘制第二遍模型,并且用线框模式(PolygonMode::LINE)绘制,设置线宽(例如10),可以绘制的条件是在模版值不等于1的地方

    这样由于线宽的缘故,最外侧的线框就保留了一半,看起来就是模型的轮廓

    以上的实现的描边效果是可以被遮挡的,就是说如果描边物体前面有个物体,描边效果将被遮挡

    如果想实现描边效果不被遮挡(类似于描边关闭深度检测),需要修改源代码

    osgFX/Outline.cpp中的119行附近

    stencil->setOperation(osg::Stencil::KEEP,osg::Stencil::KEEP,osg::Stencil::REPLACE);

    修改为

    stencil->setOperation(osg::Stencil::KEEP,osg::Stencil::REPLACE,osg::Stencil::REPLACE);

    也就是在深度测试失败的时候,深度缓存写入1

    osgFX/Outline.cpp中的146行附近,关闭深度测试(源代码中注释掉的那一行)

    //state->setMode(GL_DEPTH_TEST,Override_Off);

    修改为

    state->setMode(GL_DEPTH_TEST,Override_Off);

    为了应对有些模型的描边颜色是黑色的问题,需要将setColor中的_material全部设置成需要的描边色

    第二个pass中,cullFace->setMode(BACK)比较靠谱

    polyMode->setMode(FRONT,LINE)比较靠谱

    有些模型用到了两个纹理单元,会引起描边颜色变暗的问题

    可以在state->setTextureMode(0,GL_TEXTURE_2D,OFF)之后添加

    state->setTextureMode(1,GL_TEXTURE_2D,OFF)

  • 相关阅读:
    数据对拍
    学大伟业 Day 5 培训总结
    【luogu P3378 堆】 模板
    【luogu P1865 A % B Problem】 题解
    学大伟业 Day 4 培训总结
    【luogu P1082 同余方程】 题解
    诗一首
    【luogu P2251 质量检测】 题解
    【luogu P3865 ST表】 模板
    【luogu P1816 忠诚】 题解
  • 原文地址:https://www.cnblogs.com/coolbear/p/10563367.html
Copyright © 2020-2023  润新知