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

对一个三维场景中的物体实现描边特效,可以参考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)

转载于:https://www.cnblogs.com/coolbear/p/10563367.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值