zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/coolbear/p/10563367.html
Copyright © 2011-2022 走看看