osg-材质 (osg::Material)

news2025/4/8 18:20:25

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.coloradmin.cn/o/1356202.html

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

相关文章

VS2017 CMake编译Opencv

先下载opencv4.2.0源码以及opencv_contrib-4.2.0 地址链接&#xff1a;https://pan.baidu.com/s/1AgFsiH4uMqTRJftNXAqmTw?pwd3663 提取码&#xff1a;3663 先建立一个opencv_debug和opencv_release文件夹这两个都是为了后续存放编译好的debug版本和release版本opencv的&#…

APP自动化测试工具:八款推荐解析

uiautomator2 github地址&#xff1a;github.com/openatx/uia… UiAutomator 是 Google 提供的用来做安卓自动化测试的一个 Java 库&#xff0c;基于 Accessibility 服务。功能很强&#xff0c;可以对第三方 App 进行测试&#xff0c;获取屏幕上任意一个 APP 的任意一个控件属…

LeetCode---378周赛

题目列表 2980. 检查按位或是否存在尾随零 2981. 找出出现至少三次的最长特殊子字符串 I 2982. 找出出现至少三次的最长特殊子字符串 II 2983. 回文串重新排列查询 一、检查按位或是否存在尾随零 这题和位运算有关&#xff0c;不是很难&#xff0c;题目要求至少有两个数的…

基于SSM的新闻网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于SSM的班级事务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

WebSocket的优点和缺点:一文详解。

WebSocket 的优缺点 WebSocket 协议是一种双向通信协议&#xff0c;它使用单个 TCP 连接实现全双工通信&#xff0c;这使它比传统的 HTTP 协议更有效率。 WebSocket 优点 双向通信&#xff1a; WebSocket 协议支持双向通信&#xff0c;使服务器和客户端之间的通信更加方便和快…

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…

图像预处理——transforms

一、transforms 运行机制 torchvision是PyTorch的一个扩展库&#xff0c;提供了许多计算机视觉相关的工具和功能。下面是关于torchvision中常用模块的介绍&#xff1a; torchvision.transforms&#xff1a;提供了一系列常用的图像预处理方法&#xff0c;用于对图像进行变换、…

【生成人工智能】Ray如何解决生成人工智能基础设施的常见生产挑战

这是我们生成人工智能博客系列的第一部分。在这篇文章中&#xff0c;我们讨论了如何使用Ray来生产常见的生成模型工作负载。即将发布的一篇博客将深入探讨Alpa等项目为什么要使用Ray来扩展大型模型。 生成的图像和语言模型有望改变企业的设计、支持、开发等方式。本博客重点关…

Spring——Spring IOC(2)

1.Spring中的工厂类 1.1 ApplicationContext ApplicationContext的实现类&#xff0c;如下图&#xff1a; ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 1.2 B…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 &#xff0c;并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性&#xff0c;还可以大大减少检测时间。传统方法涉及手动检查&#xff0c;无法扩展且容易出错…

体元法--体积计算

文章目录 环境&#xff1a;1.1 体元法介绍&#xff1a;2.1 python代码3.1 可视化 环境&#xff1a; Open3D 1.1 体元法介绍&#xff1a; 用一个个体素去占据点云&#xff0c;然后对所有体素求和 2.1 python代码 conda activete deeplabv3plus(环境名称–安装好open3D的) py…

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能&#xff1a; 用户端&#xff1a;商城主页展示&#xff0c;登录&#xff0c;注册&#xff0c;用户中心&#xff0c;购物车&#xff0c;我的订单&#xff0c;购物车结算 管理端&#xff1a;登录&#xff0c;商品&…

QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件

QT的坐标系统&#xff0c;回收机制、菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;对话框及资源文件 文章目录 QT的坐标系统&#xff0c;回收机制、菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;对话框及资源文件1、QT的坐标系统&#xff1f;2、对象模型…

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍&#xff0c;想为自己的照片添加一个酷炫的火星飞舞的效果&#xff0c;素材库中正好有一张火焰的照片&#xff0c;如果想去除图中的火焰&#xff0c;只保留火星效果&#xff0c;可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代&#xff0c;电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台&#xff0c;通过其多样化的商品、便捷的购物体验和创新的商业模式&#xff0c;迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势&#xff0c;以及…

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄&#xff0c;力求题材、形式、风格多样化&#xff0c;适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源&#xff1a;npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像 2024/1/4 13:23 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Android1…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…