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

刻线特效

        刻线特效(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.hqwc.cn/news/235104.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

Verilog 入门(四)(门电平模型化)

文章目录 内置基本门多输入门简单示例 内置基本门 Verilog HDL 中提供下列内置基本门&#xff1a; 多输入门 and&#xff0c;nand&#xff0c;or&#xff0c;nor&#xff0c;xor&#xff0c;xnor 多输出门 buf&#xff0c;not 三态门上拉、下拉电阻MOS 开关双向开关 门级逻辑…

软件开发流程:基础源代码与实战详解

一、引言 在当今的信息时代&#xff0c;软件开发已成为推动社会进步和发展的重要力量&#xff0c;从智能手机应用程序到复杂的企业级系统&#xff0c;软件开发在我们的日常生活和工作中发挥着越来越重要的作用。 然而&#xff0c;对于初学者来说&#xff0c;了解软件开发流程…

Scrapy框架中间件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道&#xff08;点击前往查阅&#xff09; 4、Scrapy框架中间件 Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

以STM32CubeMX创建DSP库工程方法一

以STM32CubeMX创建DSP库工程方法 略过时钟树的分配和UART的创建等&#xff0c;直接进入主题生成工程文件 它们中的文件功能如下&#xff1a; 1&#xff09;BasicMathFunctions 基本数学函数&#xff1a;提供浮点数的各种基本运算函数&#xff0c;如向量加减乘除等运算。 2&…

【影刀RPA_写入日期到飞书表格】

飞书将日期写入多维表格&#xff0c;日期格式需要时毫秒级的时间戳才行。

【Linux】第二十一站:文件(一)

文章目录 一、共识原理二、C系列文件接口三、从C过渡到系统&#xff1a;文件系统调用四、访问文件的本质 一、共识原理 文件 内容 属性 文件分为打开的文件 和 没打开的文件 打开的文件&#xff1a;是谁打开的&#xff1f;是进程&#xff01;----所以研究打开的文件本质是研…

在线文库系统 转码功能源代码展示 支持文档在线预览查阅功能

1、支持 pdf,doc,docx,ppt,pptx,txt,xlsx,xls,csv,zip,epub,ai,psd 格式的文件 2、文库系统的上传界面&#xff0c;用户可以进行上传自己的文件&#xff0c;然后自定义文档售价&#xff0c;来赚取金额。 3、文库系统的部分代码披露&#xff1a; <template><div clas…

开关电源基础而又硬核的知识

1.什么是Power Supply? Power Supply是一种提供电力能源的设备&#xff0c;它可以将一种电力能源形式转换成另外一种电力能源形式&#xff0c;并能对其进行控制和调节。 根据转换的形式分类&#xff1a;AC/DC、DC/DC、DC/AC、AC/AC 根据转换的方法分类&#xff1a;线性电源、…

Python快速实现BMI(身体质量指数)计算器(窗口界面形式)

BMI是身体质量指数&#xff08;Body Mass Index&#xff09;的缩写&#xff0c;是一种衡量人体肥胖程度的指标。它是根据人的身高和体重计算得出的&#xff0c;公式为&#xff1a; BMI 体重&#xff08;kg&#xff09;/ 身高^2&#xff08;m&#xff09; 其中&#xff0c;体…

IPtables防火墙详解

一、IPtables介绍 iptables是unix/linux自带的一款开放源代码的完全自由的基于包过滤(对OSI模型的四层或者是四层以下进行过滤)的防火墙工具&#xff0c;它的功能十分强大&#xff0c;使用非常灵活&#xff0c;可以对流入和流出服务器的数据包进行很精细的控制。主要针对网络访…

js提取iconfont项目的图标

iconfont 可以让我们轻松使用字体图标&#xff0c;比如使用 iconfont 提供的 js&#xff0c;就可以愉快的码代码了。 //at.alicdn.com/t/c/font_xxxxx.js通常公司会有提供一套图标供所有系统使用&#xff0c;比如图标库里有 1000 个图标&#xff0c;但某个项目只需要使用 10 个…