osgFX扩展库-刻线特效、立方图镜面高光特效(2)

news2024/9/22 7:25:07

刻线特效

        刻线特效(osgFX::Scribe)是一个双通道的特效,第一个通道以通常的方式渲染图形,第二个通道使用线框模式。用户设置好光照和材质之后,即可使用指定的颜色进行渲染。这个特效使用了PolygonOffset渲染属性类来避免多边形斑驳(Z-fighting)的现象,它所需的OpenGL版本至少为1.1。

        osgFX::Scribe 的继承关系图如图12-8 所示。

图12-8 osgFX::Scribe 的继承关系图

下面介绍osgFX::Scribe的一些成员函数:

  1. // 得到刻线的颜色  
  2. const osg::Vec4 & getWireframeColor()const  
  3. // 设置刻线的颜色  
  4. void setWireframeColor(const osg::Vec4 &color)  
  5. // 得到刻线的宽度  
  6. float getWireframeLineWidth() const  
  7. // 设置刻线的宽度  
  8. void setWireframeLineWidth (float w)  

刻线特效示例

        下面通过一个例子来学习如何在场景中添加osgFX::Scribe 特效代码如程序清单 12-4 所示。

1.	/********************************** 刻线特效示例12-4 ************************************/  
2.	void scribe_12_4(const string &strDataFolder)  
3.	{  
4.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
5.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
6.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
7.	    traits->x = 40;  
8.	    traits->y = 40;  
9.	    traits->width = 600;  
10.	    traits->height = 480;  
11.	    traits->windowDecoration = true;  
12.	    traits->doubleBuffer = true;  
13.	    traits->sharedContext = 0;  
14.	  
15.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
16.	  
17.	    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();  
18.	    camera->setGraphicsContext(gc.get());  
19.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
20.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
21.	    camera->setDrawBuffer(buffer);  
22.	    camera->setReadBuffer(buffer);  
23.	  
24.	    // 读取模型,读取飞机模型  
25.	    string strDataPath = strDataFolder + "cessna.osg";//axes.osgt  
26.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
27.	  
28.	    // 创建刻线对象  
29.	    osg::ref_ptr<osgFX::Scribe> sc = new osgFX::Scribe();  
30.	    sc->setWireframeColor(osg::Vec4(1.0, 0.0, 0.0, 1.0)); // 设置轮廓线的颜色  
31.	    sc->setWireframeLineWidth(2.0);// 设置刻线的宽度  
32.	    sc->addChild(node.get());//添加子节点  
33.	  
34.	    root->addChild(sc.get());  
35.	  
36.	    // 优化场景数据  
37.	    osgUtil::Optimizer optimizer;  
38.	    optimizer.optimize(root.get());  
39.	  
40.	    viewer->setSceneData(root.get());  
41.	  
42.	    viewer->realize();  
43.	    viewer->run();  
44.	}  

        运行程序,截图如图12-9 所示

图12-9刻线特效示例截图

​​​​​​​立方图镜面高光特效

        立方图镜面高光特效(osgFX::SpecularHighlights)在片断层级(fragment level)上(而不是OpenGL通常的顶点层级)应用了镜面高光。它使用了立方映射图和反射纹理生成(reflective texgen)的技术,首先要计算出纹理矩阵以实现立方映射图的自动旋转,这样无论从观察的方向和光照位置上来说,镜面光的效果都将始终不变。用户可以选择使用何种光照来计算纹理矩阵。该特效需要GL_ARB_texture_env_add扩展以及任意一种立方映射图扩展(GL_EXT_texture_cube_map、GL_ARB_texture_cube_map或OpenGL1.3)的支持。

        osgFX::SpecularHighlights 的继承关系图如图12-10所示。

图12-10 osgFX::SpecularHighlights 的继承关系图

        下面介绍osgFX::SpecularHighlights 的一些成员函数:

  1. int getLightNumber() const  // 得到光源数
  2. void setLightNumber(int n)  // 设置光源数
  3. int getTextureUnit()const  // 得到纹理单元 
  4. void setTextureUnit(int n) // 设置纹理单元 
  5. const osg::Vec4 & getSpecularColor()const // 得到镜面高光的颜色 
  6. void setSpecularColor(const osg::Vec4 &color) // 设置镜面高光的颜色 
  7. float getSpecularExponent()const // 得到镜面高光指数 
  8. void setSpecularExponent(float c) // 设置镜面高光指数 

​​​​​​​立方图镜面高光特效示例

        下面通过一个例子来学习如何在场景中添加osgFX::SpecularHighlights特效。

        代码如程序清单12-5所示。

1.	/********************************** 立方图镜面高光特效示例 12-5 ************************************/  
2.	void specularHighlights_12_5(const string &strDataFolder)  
3.	{  
4.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
5.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
6.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
7.	    traits->x = 40;  
8.	    traits->y = 40;  
9.	    traits->width = 600;  
10.	    traits->height = 480;  
11.	    traits->windowDecoration = true;  
12.	    traits->doubleBuffer = true;  
13.	    traits->sharedContext = 0;  
14.	  
15.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
16.	  
17.	    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();  
18.	    camera->setGraphicsContext(gc.get());  
19.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
20.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
21.	    camera->setDrawBuffer(buffer);  
22.	    camera->setReadBuffer(buffer);  
23.	  
24.	    // 读取模型,读取飞机模型  
25.	    string strDataPath = strDataFolder + "cessna.osg";//axes.osgt  
26.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
27.	  
28.	    // 创建镜面高光对象  
29.	    osg::ref_ptr<osgFX::SpecularHighlights> shl = new osgFX::SpecularHighlights();  
30.	    shl->setTextureUnit(0); // 设置纹理单元,被设置的纹理单元将应用于立方图纹理  
31.	    shl->setLightNumber(6); // 设置光源数  
32.	    shl->setSpecularColor(osg::Vec4(1.0, 1.0, 1.0, 1.0));// 设置镜面光颜色  
33.	    shl->setSpecularExponent(16.0);// 设置镜面指数  
34.	  
35.	    shl->addChild(node.get());//添加子节点  
36.	  
37.	    root->addChild(shl.get());  
38.	  
39.	    // 优化场景数据  
40.	    osgUtil::Optimizer optimizer;  
41.	    optimizer.optimize(root.get());  
42.	  
43.	    viewer->setSceneData(root.get());  
44.	  
45.	    viewer->realize();  
46.	    viewer->run();  
47.	} 

        运行程序,截图如图12-11 所示。

图12-11立方图镜面高光特效示例截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1273117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ Primer Plus学习记录】嵌套循环和二维数组

for循环是一种处理数组的工具。下面进一步讨论如何使用嵌套for循环中来处理二维数组。 C没有提供二维数组类型&#xff0c;但是用户可以创建每个元素本身都是数组的数组。例如&#xff0c;假设要存储5个城市在4年间的最高温度&#xff0c;可以这样声明数组&#xff1a; int m…

机器学习入门(第四天)——朴素贝叶斯

知识树 Knowledge tree P(y|x)&#xff0c;P给定x的条件下&#xff0c;y的概率。如&#xff1a;P(y我招女孩子喜欢的概率|我是学生) 一个小故事 A story 女朋友和妈妈掉河里&#xff0c;路人拿出3颗豆&#xff0c;两颗红豆1颗绿豆。如果我抽中红豆救女朋友&#xff0c;抽中绿…

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏5(附项目源码)

文章目录 本节最终效果前言能力升级系统绘制升级按钮武器升级道具升级治疗物品效果双手放置武器控制武器移动转向排序默认先隐藏武器&#xff0c;去除默认的武器精灵图片数据联动完善升级界面控制窗口开启关闭时间控制&#xff0c;升级暂停游戏每次升级随机获取属性项目控制等级…

2023/11/24JAVAweb学习(Vue常用指令,Vue.js文件,Ajax,Axios两种请求,Vue-cli脚手架,Vue项目,Element)

age只会执行成立的,show其实都展示了,通过display不展示 使用Vue,必须引入Vue.js文件 假如运行报错,以管理员身份打开vscode,再运行 ------------------------------------------------------------------- 更改端口号

如何有效避免七个常见的身份验证漏洞

引言 随着网络威胁的数量不断增加&#xff0c;了解学习可能会危及到客户在线身份的常见身份验证漏洞就显得格外重要。如果需要在网上满足客户的需求&#xff0c;并使用传统的身份验证机制时&#xff0c;就要对身份验证漏洞保持警惕。 只有了解了这些漏洞&#xff0c;才可以更…

如何配置mybatis中mapper对应关系,解决mybatis报错:Invalid bound statement (not found):

先看一下报错信息&#xff1a; Invalid bound statement&#xff1a;意思是无效的绑定语句 原因就是&#xff1a;在使用mybatis时mapper.xml没有和mapper接口对应起来 解决方式 第一种&#xff1a; 将mapper.xml和mapper接口放在同一位置 在pom中配置&#xff1a; <reso…

C# WPF上位机开发(抽奖程序)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 每到年末或者是尾牙的时候&#xff0c;很多公司都会办一些年终的清楚活动&#xff0c;感谢员工过去一年辛苦的付出。这个时候&#xff0c;作为年会…

专访|OpenTiny 开源社区 常浩:完成比完美更重要

前言 2023年已过大半&#xff0c;备受关注的 OpenTiny*开源之夏活动也顺利结项。开源之夏由中国科学院软件研究所发起的计划&#xff0c;目的在于鼓励在校学生积极参与开源软件的开发维护&#xff0c;推动优秀开源软件社区的繁荣发展。该活动联合各大开源社区&#xff0c;聚焦…

五要素超声波气象站-气象站小百科

随着科技的发展&#xff0c;人们对气象监测的需求也越来越高。为了满足这一需求&#xff0c;一款全新的五要素超声波气象站应运而生。这款气象站不仅具有高精度的测量能力&#xff0c;而且能够实时监测天气变化&#xff0c;为人们提供准确的气象数据。 一、实时监测&#xff0…

【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(三):Jacobi 旋转法【理论到程序】

文章目录 一、Jacobi 旋转法1. 基本思想2. 计算过程演示 二、Python实现迭代过程&#xff08;调试&#xff09; 矩阵的特征值&#xff08;eigenvalue&#xff09;和特征向量&#xff08;eigenvector&#xff09;在很多应用中都具有重要的数学和物理意义。Jacobi 旋转法是一种用…

华为云之云桌面Workspace的使用体验

华为云之云桌面Workspace的使用体验 一、云桌面Workspace介绍1.云桌面简介2.云桌面特点3. 云桌面应用场景①远程移动办公②协同办公③安全办公④公用终端⑤图形制作渲染 二、本次实践介绍1. 本次实践目的2. 本次实践环境 三、购买云桌面1. 进入华为云的云桌面购买界面2. 选择购…

智能优化算法应用:基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法结果…

【蓝桥杯选拔赛真题70】Scratch输入输出数字 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch输入输出数字 一、题目要求 编程实现 二、案例分析 1、角色分析

文件夹重命名技巧:用关键词替换文件夹名称指定内容的右侧文字

在日常生活中&#xff0c;经常要管理大量的文件夹&#xff0c;这时候掌握一些文件夹重命名的技巧就非常实用。例如文件夹重命名时&#xff0c;经常要将一些通用的文字替换成其他关键词&#xff0c;以便更好地标识和分类文件夹。而用关键词替换文件夹名称指定内容的右侧文字&…

智能优化算法应用:基于纵横交叉算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于纵横交叉算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于纵横交叉算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.纵横交叉算法4.实验参数设定5.算法结果6.参考…

亚马逊云科技re:Invent Peter DeSantis演讲,数据规模拓展无极限引领Serverless构建之路

re:lnvent 2023 Peter DeSantis主题演讲&#xff0c;数据规模拓展无极限引领Serverless构建之路&#xff08;Road to Serverless&#xff09;。 Logical Qubit全新发布&#xff1a;量子计算硬件&#xff0c;6倍的量子纠错效率提升。 Amazon全新发布Redshift Serverless&#xf…

RedisTemplate中使用scan方法代替keys指令

keys * 这个命令千万别在生产环境乱用&#xff0c;危险级别不亚于flushdb。因为Redis是单线程操作&#xff0c;在数据特别庞大的情况下。Keys会引发Redis锁&#xff08;数据过多一直查询处理&#xff09;&#xff0c;并且增加Redis的CPU占用。很多公司的运维都是禁止了这个命令…

Python实现FA萤火虫优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

狗都会配的SNAT和DNAT配置

1 SNAT 1.1 SNAT SNAT原理与应用:. SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理:源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 SNAT转换前提条件: 1.局域网各主机已正确设…

13-Vue基础之自定义指令与插槽的使用

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…