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

2023-11-30 22:28

本文主要是介绍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立方图镜面高光特效示例截图

这篇关于osgFX扩展库-刻线特效、立方图镜面高光特效(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438774

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else

PHP7扩展开发之类型处理

前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: <?phpfunction get_size ($value) {if (is_string($value)) {return "string size is ". strlen($value);} else if (is_array($value)) {return "array si

『功能项目』战士的平A特效【35】

我们打开上一篇34武器的切换实例的项目, 本章要做的事情是在战士的每次按A键时在指定位置生成一个平A特效 首先将之前下载的技能拖拽至场景中 完全解压缩后重命名为AEffect 拖拽至预制体文件夹 进入主角动画的战士动画层级 双击第一次攻击 选择Animation 创建事件 创建的动画事件帧放在攻击动画挥剑指定处 命名为PerpetualAtt

PHP7扩展开发之依赖其他扩展

前言 有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。 代码 基础代码 确保say扩展的头文件正确安装到了php

PHP7扩展开发之函数方式使用lib库

前言 首先说下什么是lib库。lib库就是一个提供特定功能的一个文件。可以把它看成是PHP的一个文件,这个文件提供一些函数方法。只是这个lib库是用c或者c++写的。 使用lib库的场景。一些软件已经提供了lib库,我们就没必要再重复实现一次。如,原先的mysql扩展,就是使用mysql官方的lib库进行的封装。 在本文,我们将建立一个简单的lib库,并在扩展中进行封装调用。 代码 基础

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa