osgFX扩展库-异性光照、贴图、卡通特效(1)

        本章将简单介绍 osgFX扩展库及osgSim 扩展库。osgFX库用得比较多,osgSim库不常用,因此,这里只对这个库作简单的说明。

osgFX扩展库

        osgFX是一个OpenSceneGraph 的附加库,是一个用于实现一致、完备、可重用的特殊效果的构架工具,其效果可以添加到OSG 的节点中,它同时还包含了一系列预定义好的特殊效果。可以用一个简单的继承关系图来表示,如图 12-1 。

图 12-1 osgFX类的承关系图

 

异性光照特效

        各向异性光照(Anisotropic Lighting)特效使用单一通道,它使用了一种各向异性的光照来替代OpenGL 的标准光照模型。几何体顶点的颜色在这里不是直接进行计算的,而是纹理映射到用户指定的光照图板的结果。这里需要使用顶点着色器(vertex program)来计算纹理坐标S和T的值:S=N×H ;T=N×L ,这里N表示顶点的法线,L表示光到顶点的向量,H表示中间向量。这种特效很好地演示了State::getInitialViewMatrix()方法的使用,它可以直接获取视口的初始矩阵并实现直接与视口相关的特效,而不需要任何假借的工作,但该特效需要ARB_vertex_program扩展的支持。

        osgFX::AnisotropicLighting 的继承关系图如图12-2所示。

图12-2 osgFX::AnisotropicLighting 的继承关系图

        从继承关系图中可以看出,osgFX::AnisotropicLighting是一个组节点,它继承自osgFX::Effect类。后面将要介绍的集中特效同样继承自 osgFX::Efect类。因此,如果读者需要自己编写相关的特效,可以继承自osgFX::Effect 类

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

  1. osg::lmage* getLightingMap () // 得到光照贴图  
  2. const osg::Image " getLightingMap () const // 得到const光照贴图  
  3. void setLightingMap(osg::Image *image) // 设置光照贴图  
  4. int getLightNumber() const // 得到光源数  
  5. void setLightNumber(int n) // 设置光源数,通常支持的光源数8个以下  

异性光照特效示例

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

1.	/********************************** 异性光照特效示例12-1 ************************************/  
2.	void anisotropicLighting_12_1(const string &strDataFolder)  
3.	{  
4.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
5.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
6.	    traits->x = 40;  
7.	    traits->y = 40;  
8.	    traits->width = 600;  
9.	    traits->height = 480;  
10.	    traits->windowDecoration = true;  
11.	    traits->doubleBuffer = true;  
12.	    traits->sharedContext = 0;  
13.	  
14.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
15.	  
16.	    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();  
17.	    camera->setGraphicsContext(gc.get());  
18.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
19.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
20.	    camera->setDrawBuffer(buffer);  
21.	    camera->setReadBuffer(buffer);  
22.	  
23.	    // 读取模型,读取飞机模型  
24.	    string strDataPath = strDataFolder + "cessna.osg";  
25.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
26.	  
27.	    // 读取贴图  
28.	    strDataPath = strDataFolder + "Images\\osg256.png";  
29.	    osg::ref_ptr<osg::Image> image = osgDB::readImageFile(strDataPath);  
30.	  
31.	    // 创建各向异性光照  
32.	    osg::ref_ptr<osgFX::AnisotropicLighting> atl = new osgFX::AnisotropicLighting();  
33.	  
34.	    // 设置光照图  
35.	    atl->setLightingMap(image);  
36.	  
37.	    // 设置光源数,支持光源数在8以下  
38.	    atl->setLightNumber(7);  
39.	    atl->addChild(node.get());  
40.	  
41.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
42.	    root->addChild(atl.get());  
43.	  
44.	    // 优化场景数据  
45.	    osgUtil::Optimizer optimizer;  
46.	    optimizer.optimize(root.get());  
47.	  
48.	    viewer->setSceneData(root.get());  
49.	  
50.	    viewer->realize();  
51.	    viewer->run();  
52.	}  

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

图12-3异性光照特效示例截图

凹凸贴图特效

        凹凸贴图(Bump Mapping)特效可以创建一种凹凸不平的表面效果。其子节点必须使用两种纹理,一种是漫反射颜色,另一种是法线贴图(可以使用 aVIDIA 的法线贴图生成器或其他工具,根据高度图自动生成)。此外,还需要创建正切空间 (tangent-space)的基向量并将其关联到每个 Geometry 几何体上(这一步骤可以调用BumpMapping::prepareChildren()方法迅速完成)。注意Geometry对象的漫反射颜色和法线贴图纹理都必须提前定义好对应的UV贴图.该特效推荐使用一种运用了ARB顶点和片段着色器的技法,另外,还定义了一种不使用片段着色器的技法。后者无法处理环境和镜面组件的运算,因此在运行时很受限制。

        osgFX::BumpMapping 的继承关系图如图12-4所示。

图12-4 osgFX::BumpMapping 的继承关系图

        从继承关系图中可以看出osgFX::BumpMapping 继承自ogFX::Effect类,也是一个组节点,可以添加自己的叶节点。

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

int getLightNumber()const// 得到光源数  
void setLightNumber(int n) // 设置光源数  
int getDiffuseTextureUnit()const// 得到漫反射纹理单元  
void setDiffuseTextureUnit(int n) // 设置漫反射纹理单元  
int getNormalMapTextureUnit()const// 得到法线纹理单元  
void setNormalMapTextureUnit(int n) // 设置法线纹理单元  
osg::Texture2D* getOverrideDiffuseTexture()//得到替代子节点的漫反射纹理  
const osg::Texture2D * getOverrideDiffuseTexture()const// 得到替代子节点的漫反射纹理  
void setOverrideDiffuseTexture(osg::Texture2D *texture) // 设置替代子节点的漫反射的纹理  
osg::Texture2D* getOverrideNormalMapTexture()// 得到替代子节点的法线纹理  
const osg:Texture2D * getOverrideNormalMapTexture()const// 得到替代子节点的法线纹理  
void setOverrideNormalMapTexture(osg::Texture2D *texture) // 设置替代子节点的法线纹理  
void prepareGeometry(osg::Geomctry *geo) //预备一个Geometry用来实现凸凹光照  
void prepareNode(osg::Node *node) //预备一个Geometry用来实现凸凹光照  
void prepareChildren0) //预备一个Geomctry 用来实现凸凹光照  
void setUpDemo()//设置默认的漫反射和法线贴图环境  

贴图特效示例

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

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

1.	/********************************** 凹凸贴图特效示例12-2 ************************************/  
2.	void bumpMapping_12_2(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";  
26.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
27.	  
28.	    //创建凹凸贴图对象  
29.	    osg::ref_ptr<osgFX::BumpMapping> bm = new osgFX::BumpMapping();  
30.	    //添加子节点  
31.	    bm->addChild(node.get());  
32.	    //设置光源数  
33.	    //bm->setLightNumber(6);  
34.	    //设置漫反射纹理单元  
35.	    bm->setDiffuseTextureUnit(0);  
36.	    //设置法线纹理单元,注意不能于前面的漫反射单元相同  
37.	    bm->setNormalMapTextureUnit(1);  
38.	    //设置默认的漫反射和法线贴图环境,并设置相关的纹理坐标  
39.	    bm->setUpDemo();  
40.	  
41.	    root->addChild(bm.get());  
42.	  
43.	    // 优化场景数据  
44.	    osgUtil::Optimizer optimizer;  
45.	    optimizer.optimize(root.get());  
46.	  
47.	    viewer->setSceneData(root.get());  
48.	  
49.	    viewer->realize();  
50.	    viewer->run();  
51.	}  

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

图12-5 凹凸贴图特效示例图

卡通染特效

        卡通渲染(Cartoon)特效实现了一种名为卡通着色(Cel-Shading)的方法,从而产生一种卡通式的(非真实感的)渲染效果。它需要两个通道支持:第一个用于绘制实体表面,第二个用于绘制轮廓线。该特效需要使用顶点着色器来设置纹理坐标,以便在运行时生成的纹理单元0上实现一种尖锐的光照效果。该特效需要ARB_vertex_program扩展或者OpenGL着色语言的支持。osgFX::Cartoon的继承关系图如图12-6所示。

图12-6 osgFX::Cartoon 的继承关系图

1.	// 得到轮廊线的颜色  
2.	const osg::Vec4 & getOutlineColor() const  
3.	// 设置轮廓线的颜色  
4.	void setOutlineColor (const osg::Vec4 &color)  
5.	// 得到轮廓线的宽度  
6.	float getOutlineLineWidth()const  
7.	// 设置轮廊线的宽度  
8.	void setOutlincLineWidth (float w)  
9.	// 得到光源数  
10.	int getLightNumber() const  
11.	// 设置光源数  
12.	void setLightNumber(int n)  

 卡通渲染特效示例

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

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

1.	/********************************** 卡通渲染特效示例12-3 ************************************/  
2.	void cartoon_12_3(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";  
26.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
27.	  
28.	    // 创建卡通渲染对象  
29.	    osg::ref_ptr<osgFX::Cartoon> ct = new osgFX::Cartoon();  
30.	    ct->setOutlineColor(osg::Vec4(1.0, 1.0, 1.0, 1.0)); // 设置轮廓线的颜色  
31.	    ct->setOutlineLineWidth(2.0);// 设置轮廓线的宽度  
32.	    ct->setLightNumber(0); // 设置光源数,通常设置为0     
33.	    ct->addChild(node.get());//添加子节点  
34.	      
35.	    root->addChild(ct.get());  
36.	  
37.	    // 优化场景数据  
38.	    osgUtil::Optimizer optimizer;  
39.	    optimizer.optimize(root.get());  
40.	  
41.	    viewer->setSceneData(root.get());  
42.	  
43.	    viewer->realize();  
44.	    viewer->run();  
45.	} 

        运行程序,截图如图 12-7

        图 12-7卡通渲染特效例截图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

figma 基础使用——准备阶段

1. 注册账号 2. figma有客户端也有网页端&#xff0c;使用注意同步字体 之后点击下载window installeer 字体 3. 安装 Figma汉化包 通过figma.cool 网站&#xff0c;下载离线的汉化包 之后通过谷歌的扩展程序添加

Charles下载安装及配置之Mac

因工作需要用到抓包工具&#xff0c;但Fiddler不能在mac上使用&#xff0c;所以找到了Charles&#xff0c;Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到…

WordPress自动采集伪原创发布工具

在当今数字化时代&#xff0c;随着信息爆炸式增长&#xff0c;网站内容的更新速度飞快。对于拥有WordPress网站的用户而言&#xff0c;如何轻松而又快速地批量采集伪原创内容成为一项具有挑战性的任务。本文将专心分享一些方法和技巧&#xff0c;帮助WordPress用户实现批量采集…

SpringBoot整合EasyExcel实现复杂Excel表格的导入导出功能

文章目录 &#x1f389;SpringBoot整合EasyExcel实现复杂Excel表格的导入&导出功能 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;架构设计&#x1f4dc;其他专栏&#xff1a;Java学习路线 Jav…

uniapp使用vue3和ts开发小程序获取用户城市定位

这个组件的功能&#xff1a;可以重新定位获取到用户的具体位置&#xff0c;这个是通过getLocation这个api和高德地图的api获取到的&#xff0c;getLocation这个api需要在微信公众平台后台>开发管理> 接口管理里面申请才能使用的&#xff0c;不然无法使用哦&#xff0c;这…

Python自动化办公:PDF文件的加密与解密

在本篇文章中&#xff0c;我们将介绍如何使用PyPDF2库对PDF文件进行加密和解密操作。 包括如何给PDF文件添加密码&#xff0c;以及如何从受密码保护的PDF文件中删除密码。 注&#xff1a;删除密码的操作&#xff0c;前提是需要知道密码哦 1. 安装PyPDF2库 首先&#xff0c;…

STM32之模数转换器ADC

目录 1、ADC介绍 1.什么是ADC&#xff1f; ADC的全称是Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 2.ADC的性能指标 3.ADC特性 12位分辨率 4.ADC通道 5.ADC转换顺序 6.ADC触发方式 7.ADC转化时间 8.ADC转化模式 9.模拟看门狗 实验&#xff1a;使用ADC读…

如何集成一个TypeScript开发环境?

首先要安装个node.js。Node.js (nodejs.org) 然后我们随便建一个文件夹&#xff0c;并且打开它运行到终端 然后再运行命令&#xff1a; npm install typescript -g 成功后 尝试使用 tsc -v 查看版本 接下来再使用命令&#xff1a; tsc --init 我们在.ts文件中尝试输出一些…

Docker智驾开发环境搭建

文章目录 背景1. 什么是容器?2. 什么是Docker?2.1 Docker架构3. 为什么要使用Docker?3.1 Docker容器虚拟化的好处3.2 Docker在开发和运维中的优势4. Docker容器与传统虚拟化的区别4.1 区别4.2 Docker的优势5. Docker的核心概念6. Docker在嵌入式开发中的应用7. docker实践参…

python炒股自动化(1),量化交易接口区别

要实现股票量化程序化自动化&#xff0c;就需要券商提供的API接口&#xff0c;重点是个人账户小散户可以申请开通&#xff0c;上手要简单&#xff0c;接口要足够全面&#xff0c;功能完善&#xff0c;首先&#xff0c;第一步就是要找对渠道和方法&#xff0c;这里我们不讨论量化…

Fuzz进阶教学——人工智能在模糊测试中的应用

【参考文献】白海波.人工智能技术在模糊测试中的应用[J].数字技术与应用,2023,41(08):16-18.DOI:10.19695/j.cnki.cn12-1369.2023.08.05. 目录 摘要 一、模糊测试简介 1、原理 2、工作流程 3、分类 4、应用领域 二、人工智能在模糊测试中的应用 1、人工智能技术 2、人…

AIGC系列之:GroundingDNIO原理解读及在Stable Diffusion中使用

目录 1.前言 2.方法概括 3.算法介绍 3.1图像-文本特征提取与增强 3.2基于文本引导的目标检测 3.3跨模态解码器 3.4文本prompt特征提取 4.应用场景 4.1结合生成模型完成目标区域生成 4.2结合stable diffusion完成图像编辑 4.3结合分割模型完成任意图像分割 1.前言 …

前馈式神经网络与反馈式神经网络的区别,联系,各自的应用范围和场景!!!

文章目录 前言一、前馈式神经网络是什么&#xff1f;二、前馈式神经网络包括&#xff1a;三、反馈式神经网络是什么&#xff1f;四、反馈式神经网络包括&#xff1a;总结 前言 前馈式神经网络和反馈式神经网络是两种主要的神经网络架构&#xff0c;它们在网络结构和应用场景上…

Python接口自动化测试 ---Allure报告使用详解

这一节主要是记录allure的内容以及用法&#xff0c;怎么让他生成一个完整的想要的报告。 allure生成的报告和其他五花八门的报告对比了一下&#xff0c;它的可读性是最好、最直观的。这不仅仅是我想要的效果&#xff0c;也是很多小伙伴想要的结果&#xff0c;毕竟这是给领导看…

使用Prometheus监控Synology(群辉)

1、简介 在现代的IT环境中&#xff0c;对于服务器和网络设备的监控是至关重要的。Synology&#xff08;群辉&#xff09;作为一种流行的网络存储解决方案&#xff0c;为用户提供了高性能和可靠的存储服务。然而&#xff0c;了解Synology设备的运行状况和性能指标对于确保其正常…

有权图的最短路径算法

目录 单源最短路径问题 Dijkstra算法 原理 ​ 获得最短路径长度的Dijkstra代码实现 时间复杂度 算法优化 优先队列优化后的代码实现 时间复杂度 可以具体获得最短路径的Dijkstra代码实现 Bellman-Ford算法 原理 代码实现 Floyed算法 原理 代码实现 单源最短路…

TLS、对称/非对称加密、CA认证

1. SSL与TLS SSL/TLS是一种密码通信框架&#xff0c;他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码&#xff0c;消息认证码&#xff0c;公钥密码&#xff0c;数字签名&#xff0c;伪随机数生成器等&#xff0c;可以说是密码学中的集大成者。 TLS…

flask web开发学习之初识flask(一)

一、概念 flask是一个使用python编写的轻量级web框架&#xff0c;作者为Armin Ronacher&#xff08;中文名&#xff1a;阿尔敏罗纳彻&#xff09;&#xff0c;它广泛被应用于web开发和API。flask提供了简洁而灵活地方式来构建web应用&#xff0c;它不会强加太多约束&#xff0…

父进程隐藏——ConsoleApplication903项目

首先我发现用calc来做进程隐藏实验是失败的&#xff0c;父进程一直都是svhost.exe 那么我用我自己生成的cs木马beacon903.exe试试 试试explorer.exe 再试试cmd.exe 可以看到成功变成cmd.exe 可以看到我们可以通过这种方式虚假父进程 以上我们是直接获得的pid&#xff0c;那…

Opencv | 直方图均衡化

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() cv2.calcHist(images,channels,mask,histSize,ranges) - …