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 材质类示例截图

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

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

相关文章

DBSCAN聚类算法

DBSCAN读作&#xff1a;DB Scan&#xff0c;是英语基于密度的噪声应用空间聚类&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;的简写。在理解K-means聚类算法之后再来理解DBSCAN就容易多了。 DBSCAN的步骤如下&#xff1a; 随机从一个…

年终特辑 | 2023卓翼飞思答卷,诚邀您共同翻阅...

朝夕轮转 , 岁序更替&#xff0c;站在岁末&#xff0c;回首2023 &#xff0c;汇成的每一帧都有迹可循 &#xff1b;卓翼飞思实验室产品升级、技术创新、服务卓越、勇毅前行以抢拼实干兑现硕果&#xff01;无论您是亲历者&#xff0c;还是见证者&#xff0c;我们在此诚邀您共同翻…

高效工具汇总,让学习和办公飞起来

目录 1、寻找论文&#xff0c;效率很高2、学习各类编程的地方 1、寻找论文&#xff0c;效率很高 AMiner&#xff0c;由清华大学计算机科学与技术系的唐杰教授团队开发的一个显著的学术搜索和挖掘系统。系统提供了一整套功能以协助学术研究&#xff0c;包括研究人员档案、专家搜…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据 多选改单选

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 3、Tree 树形控件 多选改为单选&#xff0c;且只有最末端子级可以选择 不足…

Django 8 通用视图基础

1. 什么是通用视图 1. 在terminal 输入 django-admin startapp the_12回车 2. tutorial\settings.py 注册 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.sta…

链接器--动态链接器--延迟绑定与动态链接器是什么?学习笔记二

内容在下面链接&#xff08;通过新建标签页打开&#xff09;&#xff1a; 链接器--动态链接器--延迟绑定与动态链接器是什么&#xff1f;学习笔记二一个例子来看延迟加载https://mp.weixin.qq.com/s?__bizMzkyNzYzMjMzNA&mid2247483713&idx1&snee90a5a7d59872287…

C++知识切片①:运算符重载之前置递增和后置递增

文章目录 前置递增的实现1.先写好main函数及头文件2.自定义MyInteger类3.重定义cout4.在类内实现前置递增 后置递增的实现完整代码 在进行运算符重载之前&#xff0c;不妨先看看常规的前置递增和后置递增的区别&#xff1a; 前置递增如a所示&#xff0c;a是先进行递增计算&…

人工智能大模型:定义、发展和应用

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

k8s中的容器探针

pod的容器健康检查---探针 probe&#xff1a;k8s对容器执行的定期检查&#xff0c;诊断。 探针的三种规则 所有的探针都是针对容器不是针对pod 1、 存活探针---livenessProbe&#xff1a;探测容器是否正常运行。如果发现探测失败&#xff0c;会杀掉容器。容器会根据重启策略…

B端产品经理学习-对用户进行需求挖掘

目录&#xff1a; 用户需求挖掘的方法 举例&#xff1a;汽车销售系统的用户访谈-前期准备 用户调研提纲 预约用户做访谈 用户访谈注意点 我们对于干系人做完调研之后需要对用户进行调研&#xff1b;在C端产品常见的用户调研方式外&#xff0c;对B端产品仍然适用的 用户需…

顺序表——习题

1. 轮转数组 代码实现&#xff1a; // 逆置数组 void nizhi_array(int *nums, int l, int r) { // 左闭右闭if (l > r) {return ;}for (int i l, j r; i < j; i, j--) {int temp nums[i];nums[i] nums[j];nums[j] temp;} }void rotate(int *nums, int numsSize, int…

C语言中关于strcpy函数的理解

strcpy的功能是将源指向的字符串复制到另外一个字符串中 目标指向的数组的大小应该要足够长&#xff0c;避免让源字符串中的数据溢出 关于这个函数的具体用法&#xff0c;我们可以看看下面这个程序 注意&#xff1a;strcpy函数的头文件是<string.h>&#xff0c;我们在用…

Arduino开发实例-EMG 肌肉信号传感器

EMG 肌肉信号传感器 文章目录 EMG 肌肉信号传感器1、EMG 肌肉信号传感器介绍2、硬件准备及接线3、代码实现1、EMG 肌肉信号传感器介绍 在医学研究中,测量肌肉的活动、收缩和扩张非常重要。 EMG 肌肉传感器测量肌肉活动并产生信号以显示扩张和收缩量。 因此,输出取决于所选肌…

JavaWeb——后端之maven

三、后端Web开发 1. Maven 1.1 概念 概念&#xff1a; 一款用于管理和构建java项目的工具&#xff0c;是apache下的一个开源项目 作用&#xff1a; 依赖管理&#xff1a;jar包&#xff0c;避免版本冲突问题——不用手动导jar包&#xff0c;只需要在配置文件&#xff08;pom…

【数据库原理】(8)关系数据库的关系代数

关系数据语言可以分为三类: 关系代数、关系演算和介于关系代数与关系演算之间的语言 SQL。 下面专门讲述用对关系进行运算来表达查询要求的关系代数。关系代数的运算对象是关系&#xff0c;运算结果也是关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术…

若依项目(ruoy-vue)多模块依赖情况简要分析

主pom文件关键点分析 properties标签声明变量信息&#xff1a;版本号、编码类型、java版本spring-boot依赖形式&#xff1a;spring-boot-dependencies、pom、importdependencies中添加本项目内部模块&#xff0c;同时在modules中声明模块packaging打包选择pom设置打包maven-co…

VMware Workstation虚拟机CentOS 7.9 配置固定ip的步骤

VMware Workstation虚拟机CentOS7.9配置固定ip的步骤 编辑虚拟机 打开VMware Workstation。 选择要配置的虚拟机&#xff0c;但不要启动它。 点击“编辑虚拟机设置”&#xff08;Edit virtual machine settings&#xff09;。 选择“网络适配器”&#xff08;Network Adapter&…

win11电脑图形卡不支持或已禁用硬件加速怎么解决,N卡GPU看不到cuda进程怎么办

摘要 亲&#xff0c;很高兴为你解答。win11电脑图形卡不支持或已禁用硬件加速解决方法&#xff1a;1、点击任务栏上的开始图标&#xff0c;在打开的菜单中&#xff0c;点击设置&#xff0c;&#xff08;快捷键WINX&#xff0c;点击设置&#xff09;。2、Windows系统 设置窗口&a…

找不到vcruntime140.dll怎么处理?6个修复教程分享

本文将详细介绍vcruntime140.dll文件的相关内容&#xff0c;并提供6个不同的修复教程&#xff0c;帮助大家解决这一问题。 一、vcruntime140.dll是什么文件&#xff1f; vcruntime140.dll是Visual C Redistributable Packages的一部分&#xff0c;它是Microsoft Visual Studi…

C# 2中的一些小特性

一、局部类型 在C#当中有这样一个关键字partial 用来声明类&#xff0c;结构&#xff0c;接口分为多个部分来声明。使用场景可以一部分类中写实例方法&#xff0c;一部分写属性&#xff0c;我在实际工作测试中就是将属性与实际方法是分开的。相互之间的成员互相通用。 举个例子…