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

最新文章

  1. 从零开始学 Java - Spring 使用 Quartz 任务调度定时器
  2. 网页中插入FLASH(swf文件)的html代码
  3. swift学习笔记之-属性
  4. Linux system函数详解
  5. 如何让Targetprocess 中 webhook 推送comment 到指定的项目
  6. 【python】一个简单的贪婪爬虫
  7. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
  8. [iOS]提交App报错ERROR ITMS -90207
  9. core java 第四章笔记
  10. RDLC报表系列(二) 行分组
  11. PHP文件访问技术
  12. 第18章 备忘录模式(Memento Pattern)
  13. #include 和 #pragma comment 的相对路径起点
  14. xdu_1064:Desolator in RA2
  15. unity集成openinstall流程
  16. C# if判断语句执行顺序
  17. (NO.00002)iOS游戏精灵战争雏形(六)
  18. python笔记——随手记
  19. Elasticsearch 聚合统计与SQL聚合统计语法对比(一)
  20. English trip V1 - B 5.Is It Cold Outside? 外面很冷? Teacher:Corrine Key: weather

热门文章

  1. 9、SQL逻辑查询语句执行顺序
  2. centos 终端界面代理设置
  3. 从UEditor内容中获取指定节点值(转)
  4. MDX Cookbook 02 - 除数为零的问题
  5. BCD码干什么用的?
  6. python eric6 IDE
  7. 2017 33 款iOS开源库
  8. java webdriver的api的封装
  9. pandas DataFrame.shift()函数
  10. [转]Ubuntu 16.04安装有道词典