osg-材质 (osg::Material)

1.材质类

        材质类 (osg::Material)继承自osg::StateAttribute 类。osg::Material 封装了 OpenGL的 glMaterial()和glColorMaterial()指令的函数功能,其继承关系图如图5-27 所示。

图 5-27  osg::Material 的继承关系图

 

        在场景中设置节点的材质属性,首先要创建一个osg::Material 对象,然后设置颜色和其他参数,再关联到场景图形的StateSet 中,如下面的代码:

  1. osg::StateSet* state = node->getOrCreateStateSet();  
  2. osg::ref_ptr<osg::Material> mat = new osg::Material;  
  3. state->setAttribute(mat.get());  

        osg::Material类包含的主要属性如下

  1. bool _ambientFrontAndBack;// 前面与后面的环境光  
  2. Vec4 _ambientFront;       // 前面的环境光,rgbw  
  3. Vec4 _ambientBack;        // 后面的环境光,rgbw  
  4.   
  5. bool _diffuseFrontAndBack;// 前面与后面的漫射光  
  6. Vec4 _diffuseFront;// 前面的漫射光,rgbw  
  7. Vec4 _diffuseBack: // 后面的漫射光,rgbw  
  8.   
  9. bool _specularFrontAndBack;// 前面与后面的镜面光  
  10. Vec4 _specularFront;//前面的镜面光,rgbw  
  11. Vec4 _specularBack;//后面的镜面光,rgbw  
  12.   
  13. bool _emissionFrontAndBack;// 前面与后面的发射光(emission)  
  14. Vec4 _emissionFront; // 前面的emissionrgbw  
  15. Veo4 _emissionBack:  // 后面的emissionrgbw  
  16.   
  17. bool _shininessFrontAndBack;// 前面与后面的发光(shininess)  
  18. float _shininessFront:// 前面的shininess  
  19. float _shinincssBack; // 后面的shininess  
  • 注意:shininess是一个在0~128.0之间的值,值越大,亮点越小、越亮。

        OSG材质的面如下:

  1. enum Face  
  2. {  
  3.     FRONT=GL_FRONT,//  
  4.     BACK=GL_BACK//  
  5.     FRONT_AND_BACK=GL_FRONT_AND_BACK/前、后  

        OSG材质的颜色模式如下:

  1. enum ColorMode  
  2. {  
  3.     AMBIENT = GL_AMBIENT, //环境光颜色  
  4.     DIFFUSE = GL_DIFFUSE, //漫射光颜色  
  5.     SPECULAR = GL_SPECULAR, //镜面光颜色  
  6.     EMISSION = GL_EMISSION, //发射光颜色  
  7.     AMBIENT_AND_DIFFUSE=GL_AMBIENT_AND_DIFFUSE,// 环境与漫射光颜色  
  8.     OFF // 关闭模式  
  9. }  

        在进行很多 OpenGL的操作时,直接设置材质属性可能会过于耗费资源,而OSG提供了一种颜色跟踪材质的高效方法,操作比直接修改材质属性的效率更高,颜色跟踪材质 (color material)允许用户程序通过改变当前颜色的方法,自动改变某一特定的材质属性。在许多情形下,这一操作比直接修改材质属性的效率要高,能加强光照场景和无光照场景的联系,并满足应用程序对材质的需要。

        允许颜色跟踪材质的特性需要调用 setColorMode()方法。osg::Material类为之定义了枚举量AMBIENT、DIFFUSE、SPECULAR、EMISSION、AMBIENT_AND_DIFFUSE 以及 OFF。默认情况下,颜色跟踪模式被设置为 OFF,颜色跟踪材质被禁止。如果用户程序设置颜色跟踪模式为其他的值,那么OSG 将为特定的材质属性开启颜色跟踪材质特性,此时主颜色的改变将会改变相应的材质属性。第5.4.2节的代码段将允许颜色跟踪材质,此时几何体正面的环境材质和散射材质颜色将自动跟踪当前颜色的改变而改变。

  • 注意:根据颜色跟踪模式的取值不同,Material 类会自动允许或禁止GL_COLOR_MATERIAL,因此,用户程序不需要调用setAttributeAndModes()来允许或禁止相关的模式值。

 2.材质类示例

        材质类(osg::Material)示例的代码如程序清单5-14 所示。

1.	osg::ref_ptr<osg::Node> createNode_5_14() // 创建一个四边形节点  
2.	{  
3.	    osg::ref_ptr<osg::Geode> geode = new osg::Geode();  
4.	  
5.	    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();  
6.	  
7.	    // 设置顶点  
8.	    osg::ref_ptr<osg::Vec3Array> vc = new osg::Vec3Array();  
9.	    vc->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));  
10.	    vc->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));  
11.	    vc->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));  
12.	    vc->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));  
13.	    geom->setVertexArray(vc.get());  
14.	  
15.	    // 设置纹理坐标  
16.	    osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();  
17.	    vt->push_back(osg::Vec2(0.0f, 0.0f));  
18.	    vt->push_back(osg::Vec2(1.0f, 0.0f));  
19.	    vt->push_back(osg::Vec2(1.0f, 1.0f));  
20.	    vt->push_back(osg::Vec2(0.0f, 1.0f));  
21.	    geom->setTexCoordArray(0, vt.get());  
22.	  
23.	    // 设置法线  
24.	    osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();  
25.	    nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));  
26.	    geom->setNormalArray(nc.get());  
27.	    geom->setNormalBinding(osg::Geometry::BIND_OVERALL);  
28.	    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); // 添加图元  
29.	    geode->addDrawable(geom.get()); // 绘制  
30.	  
31.	    return geode.get();  
32.	}  
33.	  
34.	void material_5_14()  
35.	{  
36.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
37.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
38.	    traits->x = 40;  
39.	    traits->y = 40;  
40.	    traits->width = 600;  
41.	    traits->height = 480;  
42.	    traits->windowDecoration = true;  
43.	    traits->doubleBuffer = true;  
44.	    traits->sharedContext = 0;  
45.	  
46.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
47.	    osg::ref_ptr<osg::Camera> camera = new osg::Camera;  
48.	    camera->setGraphicsContext(gc.get());  
49.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
50.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
51.	    camera->setDrawBuffer(buffer);  
52.	    camera->setReadBuffer(buffer);  
53.	    viewer->addSlave(camera.get());  
54.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
55.	  
56.	    osg::ref_ptr<osg::Node> node = createNode_5_14();  
57.	  
58.	    // 得到状态属性  
59.	    osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();  
60.	    stateset = node->getOrCreateStateSet();  
61.	  
62.	    // 创建材质对象  
63.	    osg::ref_ptr<osg::Material> mat = new osg::Material();      
64.	    mat->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); // 设置正面散射颜色      
65.	    mat->setSpecular(osg::Material::FRONT, osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); // 设置正面镜面颜色     
66.	    mat->setShininess(osg::Material::FRONT, 90.0f); // 设置正面指数  
67.	    stateset->setAttribute(mat.get());  
68.	  
69.	    // 设置背面剔除  
70.	    osg::ref_ptr<osg::CullFace> cullface = new osg::CullFace(osg::CullFace::BACK);  
71.	    stateset->setAttribute(cullface.get());  
72.	    stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON);  
73.	    root->addChild(node.get());  
74.	  
75.	    // 优化场景数据  
76.	    osgUtil::Optimizer optimizer;  
77.	    optimizer.optimize(root.get());  
78.	    viewer->setSceneData(root.get());  
79.	    viewer->realize();  
80.	    viewer->run();  
81.	}  

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

图5-28 材质类示例截图

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

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

相关文章

FLatten Transformer:聚焦式线性注意力模块

线性注意力将Softmax解耦为两个独立的函数&#xff0c;从而能够将注意力的计算顺序从(querykey)value调整为query(keyvalue)&#xff0c;使得总体的计算复杂度降低为线性。然而&#xff0c;目前的线性注意力方法要么性能明显不如Softmax注意力&#xff0c;并且可能涉及映射函数…

element-plus table表格cell-style的使用

在做项目的时候使用到了这个属性 需求是&#xff1a;表格里的两个值进行匹配&#xff0c;如果不相同则给那一列的字体颜色变为红色&#xff0c;方便一眼就能看到template: 先给表格绑定一下cell-style属性 <el-table:data"tableData.slice((currentPage - 1) * page…

某音关键词搜索商品接口,某音关键词搜索商品列表接口,宝贝详情页接口,某音商品比价接口接入方案

要接入API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

广播及代码实现

广播&#xff08;Broadcast&#xff09;是一种网络通信方式&#xff0c;它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息&#xff0c;让所有设备都能接收并处理。在广播中&#xff0c;通信的目标是整个网络而不是特定的单个设备。 向子网中…

高效分割视频:批量剪辑,轻松提取m3u8视频技巧

在数字媒体时代&#xff0c;视频分割是一项常见的需求。无论是为了编辑、分享还是其他要求&#xff0c;经常要将长视频分割成多个短片。传统的视频分割方法往往需要手动操作&#xff0c;既耗时又容易出错。现在来看云炫AI智剪高效分割视频的方法&#xff0c;批量剪辑并轻松提取…

CodeWave智能开发平台--03--目标:应用创建--01模板创建依赖问题修改

摘要 本文是网易数帆CodeWave智能开发平台系列的第03篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成模板创建时的依赖问题解决。 CodeWave智能开发平台的03次接触 CodeWave参考资源 网易数帆Code…

EFCore8泛化关系在数据库中的体现

如图&#xff0c;在关系数据库中&#xff0c;数据表达为一张表&#xff0c;用一个字段“Discriminator”来做区分&#xff1a; 要达到这样的效果&#xff08;数据库中的结构&#xff09;&#xff0c;需要在XXContext中将继承关系的三个类都加上&#xff1a; public DbSet<P…

RK3399平台入门到精通系列讲解(实验篇)IO 多路复用实验之poll实验

🚀返回总目录 文章目录 一、IO 多路复用:poll介绍二、实验源码2.1、Makefile2.2、poll 实验驱动2.3、poll 驱动测试应用程序一、IO 多路复用:poll介绍 IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。 一旦某个文件描述符准备就绪,就通…

jmeter自动录制脚本功能

问题排查&#xff1a; 建议用 google浏览器&#xff1b; 重启一下jmeter&#xff1b; 过滤规则重新检查下&#xff1b; 看下代理设置是否正常&#xff1b; 注意&#xff1a;下面的的过滤设置中 用的都是正则表达式的规则。

Excelize 入选“2023开源创新榜”优秀开源项目

近日&#xff0c;由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办&#xff0c;CSDN 承办的 2023 开源创新榜专家评审会在国家科技传播中心成功举办。Excelize 电子表格文档开源基础库入选“2023开源创新榜”优秀开源项目。 评审委员…

Ubuntu上使用node搭建本地静态http服务器

1.搭建步骤 1.安装Node.js。首先确保你的Ubuntu系统已经安装了Node.js。如果没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; sudo apt-get update sudo apt-get install nodejs #安装nodejs 2.安装npm。npm是Node.js的包管理器&#xff0c;一般会随着Node.js一…

激光位移传感器,预计2026年复合年增长率为8.5%

激光位移传感器市场正在迅速增长&#xff0c;因为它们能够在各种工业应用中提供精确和准确的测量。2021-2026年预测期内&#xff0c;市场预计将以8.5%左右的复合年增长率增长。激光位移传感器市场的主要驱动因素是对非接触式和高精度测量解决方案的需求不断增加。 从全球角度来…

kubernetes(三)

文章目录 1. k8s弹性伸缩1.1 安装heapster监控1.2 弹性伸缩使用和验证 2. 持久化存储2.1 emptyDir2.2 HostPath2.3 NFS2.4 PV和PVC 1. k8s弹性伸缩 k8s弹性伸缩&#xff0c;需要附加插件heapster 1.1 安装heapster监控 使用heapster(低版本)可以监控pod压力大不大 使用hpa调节…

【Java集合类篇】HashMap的数据结构是怎样的?

HashMap的数据结构是怎样的? ✔️HashMap的数据结构✔️ 数组✔️ 链表 ✔️HashMap的数据结构 在Java中&#xff0c;保存数据有两种比较简单的数据结构: 数组和链表&#xff08;或红黑树&#xff09;。 HashMap是 Java 中常用的数据结构&#xff0c;它实现了 Map 接口。Has…

ASP.NET Core高级之认证与授权(一)--JWT入门-颁发、验证令牌

阅读本文你的收获 了解认证和授权的作用了解在ASP.NET Core中实现身份认证的技术都有哪些学习基于JWT认证并学会颁发和验证JWT令牌 一、重要的前置概念 在一个系统中&#xff0c;不是所有的功能和资源都能够被自由地访问&#xff0c;比如你存在银行系统里面的资金&#xff0c…

椭球面系列---大地坐标和笛卡尔坐标的相互转换

目录 大地坐标笛卡尔坐标大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h)转换为笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)转换为大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h) 椭球体下&#xff0c;尤其是地球的…

深度学习课程实验二深层神经网络搭建及优化

一、 实验目的 1、学会训练和搭建深层神经网络&#xff1b; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…

android 通过反射获取U盘路径地址

2015-01-20 21:37:05.420 26674-26674/ E/MainActivity: ---getUsbPath() length2 2015-01-20 21:37:05.420 26674-26674/E/MainActivity: ---getUsbPath()[/storage/emulated/0, /storage/D65A-07AE]

SpringBoot全局Controller返回值格式统一处理

一、Controller返回值格式统一 1、WebResult类 在 Controller对外提供服务的时候&#xff0c;我们都需要统一返回值格式。一般定义一个 WebResult类。 统一返回值&#xff08;WebResult类&#xff09;格式如下&#xff1a; {"success": true,"code": 2…

Mysql事务transaction简介

文章目录 什么是事务针对Mysql隔离级别读未提交读提交可重复读串行化 mysql中的数据结构索引数据结构mysql中的锁种类**共享锁和独占锁**表锁、行锁(记录锁、间隙锁、临键锁) spring中的事务事务特性 什么是事务 事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发…