wordpress网站有哪些临沂门户网站制作
- 作者: 五速梦信息网
- 时间: 2026年03月21日 05:08
当前位置: 首页 > news >正文
wordpress网站有哪些,临沂门户网站制作,阳江招聘网前程无忧,苏州seo培训1、前言 在 OSG 中存在两棵树#xff0c;即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树#xff0c;它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态#xff0c;并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisito…1、前言 在 OSG 中存在两棵树即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisitor 的 cull 过程中逐渐创建。后面所讲到的纹理、光照及材质都是关于渲染状态的控制。 2、渲染状态 OSG 支持绝大部分的 OpenGL 固定功能管道fixed function pipeline渲染如 Alpha 检验、Blending融合、剪切平面、颜色蒙板、面拣选face culling、深度和模板检验、雾效、点和线的光栅化rasterization等。OSG 的渲染状态也允许应用程序指定顶点着色vertex shader和片段着色fragment shader。 2.1 osg::StateSet 类 osg::StateSet 类派生自 osg::Referenced以实现更好的数据共享。也就是说共享同一个 osg::StateSet的 osg::Node 或 osg::Drawable 类不需要额外的代码来清理其内存空间。 用户的应用程序需要在 osg::StateSet 中设置渲染状态。可以将 StateSet 关联到场景图形中的任意一个节点Node或关联到 Drawable 类。正如大部分开发者所知OpenGL 程序的开发需要尽量使状态量的变化实现最小化并避免冗余的状态设置StateSet 对象能够自动实现这些优化过程。在 OSG 遍历整个场景图形时StateSet 类会对 OpenGL 的状态属性堆栈进行管理。因此用户程序可以对不同的场景图形子树作不同的状态设置。在每个子树的遍历过程中OSG 将会高效地执行保存和恢复渲染状态的操作。用户需要尽量使关联到场景图形的 StateSet 最少化。StateSet 越少内存的占用也越少OSG在一次场景图形遍历中所耗费的工作量也越少。 OSG 将渲染状态分成两个部分分别为渲染属性Attribute和渲染模式Mode。渲染属性也就是控制渲染特性的状态变量如雾的颜色或 Blend 融合函数都是 OSG 的状态属性。OSG 中的渲染模式和 OpenGL 的状态特性几乎是一一对应的这些特性在 OpenGL 中通过函数 glEnable()和 glDisable()进行控制。用户程序可以设置模式量以允许或禁止某个功能如纹理映射、灯光等。简单来说渲染模式是指渲染的某个功能而渲染属性是这个功能的控制变量和参数。如果要设置渲染状态的值用户程序需要执行以下两步操作 1为将要设置状态的 Node 或 Drawable 对象提供一个 StateSet 实例。 2在 StateSet 实例中设置状态的渲染模式和渲染属性。 直接从某个 Node 或 Drawable 对象中获得一个 StateSet 实例可以使用下面的方法 osg::StateSet* state obj-getOrCreateStateSet();在上面的程序段中obj 是一个 Node 或 Drawable 实例getOrCreateStateSet()是这些类定义的方法这个方法返回一个指向 StateSet 实例的指针该实例属于 obj。如果 obj 还没有设置过与之关联的StateSet那么这个方法返回一个新指针并将其关联到 obj 上。 StateSet 继承自 Referenced 类。与 StateSet 关联的 Node 或 Drawable 类内部使用 ref_ptr来引用StateSet 实例因此不是长时间引用 StateSet 的情况下也可以使用标准 C指针来定义 state。如果state 变量是某个函数内的局部变量且应用程序不会长时间引用这个StateSet那么上面代码的使用是完全正确的。上面代码中的 state 变量指向该 obj 对象的 StateSet 指针当应用程序获得了一个 StateSet的指针时就可以设置属性和模式了。 2.2 渲染属性和渲染模式 OSG 为每个状态属性定义了不同的类以便应用程序采用。所有的属性类均继osg::StateAttributeosg::StateAttribute 类是一个无法直接实例化的虚基类。 OSG 将所有的属性和模式分为两大部分即纹理texture和非纹理non-texture。本节将主要探讨非纹理渲染状态的设置。纹理渲染状态的设置将在后面的章节讨论。OSG 之所以为纹理属性的设置提供不同的接口主要是因为纹理属性需要特别为多重纹理设置纹理单元texture unit。 1设置渲染属性Attribute 如果要设置一项属性首先需要将修改的属性类实例化设置该类的数值然后用 osg::StateSet::setAttribute()将其关联到 StateSet。下面的代码段用于实现面剔除face culling的属性 //获取变量 geom 的 StateSet 指针 osg::StateSet*state geom-getOrCreateStateSet(); //创建并添加 CullFace 属性类 osg::CullFace*cf new osg::CullFace( osg::CullFace::BACK ); state-setAttribute(cf);在上面的代码段中geom 是一个 Geometry 几何类对象当然也可以是任何其他派生自 Drawable和 Node 的对象获取 geom 的 StateSet 指针后代码创建了一个新的 osg::CullFace 对象并将其关联到状态量。 2设置渲染模式Mode 用户可以使用 osg::StateSet::setMode()设置允许或禁止某种模式。例如下面的代码将打开雾效模式的许可 //获取一个 StateSet 实例 osg::StateSet*state geom-getOrCreateStateSet(); //允许这个 StateSet 的雾效模式 state-setMode( GL_FOG, osg::StateAttribute::ON );setMode()的第一个输入参数可以是任何一个在 glEnable()或 glDisable()中合法的 OpenGL 枚举量Glenum第二个输入参数可以是 osg::StateAttribute::ON 或 osg::StateAttribute::OFF。事实上这里用到了位屏蔽技术这个技术将在后面讲解继承状态时说明。 3设置渲染属性和模式 OSG 提供了一个简单的、可以同时设置属性和模式的单一函数接口。在很多情况下属性和模式之间都存在显著的关系。例如CullFace 属性的对应模式为 GL_CULL_FACE。如果要将某个属性关联到一个 StateSet同时要求打开其对应模式的许可可以使用osg::StateSet::setAttributeAndModes()方法。 下面的代码段将关联 Blend 融合检验的属性同时许可颜色融合模式。 //创建一个 BlendFunc 属性 osg::BlendFunc*bf new osg::BlendFunc(); //关联 BlendFunc 并许可颜色融合模式 state-setAttributeAndModes( bf );setAttributeAndModes()的第二个输入参数用于允许或禁止第一个参数中渲染属性对应的渲染模 式其默认值为 ON。这样用户的应用程序只需用一个函数就可以方便地指定某个渲染属性并许可其对应的渲染模式。 2.3 状态继承 当读者设置节点的渲染状态时这个状态将被赋予当前的节点及其子节点。如果子节点对同一个渲染状态设置了不同的属性参数那么新的子节点状态参数将会覆盖原有的。也就是说默认情况下子节点可以改变自身的某个状态参数或者继承父节点的同一个状态。 状态继承特性在许多情况下都非常实用但有时渲染可能需要更多特性。假设场景图形中有一个包含了实体多边形几何体的节点如果要以线框模式来渲染场景图形读者的程序就需要覆盖这种多边形渲染模式状态而不论它出现在什么位置。OSG 允许用户根据场景图形中任意位置的渲染属性和模式需求单独改变原有的状态继承特性。可以选择以下几种枚举形式。 osg::StateAttribute::OVERRIDE如果将一个渲染属性和模式设置为 OVERRIDE那么所有的子节点都将继承这一属性或模式子节点对它们的更改将会无效。 osg::StateAttribute::PROTECTED这种形式可以视为 OVERRIDE 的一个例外。凡是设置为PROTECTED 的渲染属性或模式均不会受到父节点的影响。 osg::StateAttribute::INHERIT这种模式强制子节点继承父节点的渲染状态其效果是子节点 的渲染状态被解除而使用父节点的状态替代。 读者可以对这些参数进行位或叠加操作然后再作为 setAttribute()和 setMode()建立一个场景图形和 setAttributeAndModes()的第二个参数输入。下面的代码段将强制使用线框模式渲染场景图形 //获取根节点的渲染状态 StateSet osg::StateSet*state root-getOrCreateStateSet(); //创建一个 PolygonMode 渲染属性 osg::PolygonMode*pm new osg::PolygonMode) osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE ); //强制使用线框渲染 state-setAttributeAndModes( pm,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE );使用 PROTECTED 参量可以保证父节点的渲染状态不会覆盖子节点的渲染状态。例如读者可能创建了一个发光的场景其中包含有使用亮度照明的光源几何体如果其父节点禁用了光照那么光源几何体的渲染将会出错。这时对光源几何体的 GL_LIGHTING 渲染状态使用 PROTECTED 就可以保证它依然可用。 3、渲染状态示例 3.1 效果 3.2 源码 // TestOSGProject.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。#include windows.h #include osgViewer/Viewer #include iostream #include osg/Node #include osg/Geode #include osg/Geometry #include osg/Group #include osg/Billboard #include osg/Texture2D #include osg/Image #include osg/Vec3 #include osg/Vec2 #include osg/PositionAttitudeTransform #include osg/MatrixTransform #include osgDB/ReadFile #include osgUtil/Optimizer #include osg/ClipNode #include osgViewer/ViewerEventHandlers //事件监听 #include osgGA/StateSetManipulator //事件响应类对渲染状态进行控制 #include osgUtil/Simplifier //简化几何体 #include osgUtil/DelaunayTriangulator #include osgUtil/TriStripVisitor #include osgUtil/SmoothingVisitor#pragma comment(lib, OpenThreadsd.lib) #pragma comment(lib, osgd.lib) #pragma comment(lib, osgDBd.lib) #pragma comment(lib, osgUtild.lib) #pragma comment(lib, osgGAd.lib) #pragma comment(lib, osgViewerd.lib) #pragma comment(lib, osgTextd.lib)osg::ref_ptrosg::Node createClipNode(osg::ref_ptrosg::Node subgraph) {osg::ref_ptrosg::Group root new osg::Group();osg::ref_ptrosg::StateSet stateset new osg::StateSet();//多边形线形绘制模式正面和反面都绘制osg::ref_ptrosg::PolygonMode polymode new osg::PolygonMode();polymode-setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);//启用多边形线形绘制模式并指定状态继承属性为 OVERRIDEstateset-setAttributeAndModes(polymode, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);//多边形线形绘制节点osg::ref_ptrosg::Group wireframe_subgraph new osg::Group;//设置渲染状态wireframe_subgraph-setStateSet(stateset.get());wireframe_subgraph-addChild(subgraph.get());root-addChild(wireframe_subgraph.get());osg::ref_ptrosg::MatrixTransform transform new osg::MatrixTransform;//更新回调实现动态裁剪osg::ref_ptrosg::NodeCallback nc new osg::AnimationPathCallback(subgraph-getBound().center(),osg::Vec3(0.0f, 0.0f, 1.0f), osg::inDegrees(45.0f));transform-setUpdateCallback(nc.get());//创建裁剪节点osg::ref_ptrosg::ClipNode clipnode new osg::ClipNode();osg::BoundingSphere bs subgraph-getBound();bs.radius() * 0.4f;//设置裁剪节点的包围盒osg::BoundingBox bb;bb.expandBy(bs);//根据前面指定的包围盒创建 6 个裁剪平面clipnode-createClipBox(bb);//禁用拣选clipnode-setCullingActive(false);transform-addChild(clipnode.get());root-addChild(transform.get());//创建未被裁剪的节点osg::ref_ptrosg::Group clippedNode new osg::Group;clippedNode-setStateSet(clipnode-getStateSet());clippedNode-addChild(subgraph.get());root-addChild(clippedNode.get());return root.get(); }int main() {//添加到根节点osg::ref_ptrosg::Group root new osg::Group();osg::ref_ptrosg::Node childNode osgDB::readNodeFile(cessna.osg);osg::ref_ptrosg::Node node createClipNode(childNode.get());root-addChild(node.get());//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());osg::ref_ptrosgViewer::Viewer viewer new osgViewer::Viewer();//方便查看在多边形之间切换以查看三角网viewer-addEventHandler(new osgGA::StateSetManipulator(viewer-getCamera()-getOrCreateStateSet()));viewer-addEventHandler(new osgViewer::StatsHandler());viewer-addEventHandler(new osgViewer::WindowSizeHandler());viewer-setSceneData(root.get());viewer-setUpViewInWindow(600, 600, 1000, 800);return viewer-run(); }
相关文章
-
wordpress网站压缩网页设计接私单的网站
wordpress网站压缩网页设计接私单的网站
- 技术栈
- 2026年03月21日
-
wordpress网站响应很慢网站建设工期时间表
wordpress网站响应很慢网站建设工期时间表
- 技术栈
- 2026年03月21日
-
wordpress网站统计插件wordpress插件破解下载地址
wordpress网站统计插件wordpress插件破解下载地址
- 技术栈
- 2026年03月21日
-
wordpress网站怎么打开很慢最成功的个人网站
wordpress网站怎么打开很慢最成功的个人网站
- 技术栈
- 2026年03月21日
-
wordpress网站怎么建四川成都网站优化
wordpress网站怎么建四川成都网站优化
- 技术栈
- 2026年03月21日
-
wordpress网站怎么设置关键词深圳保障性住房查询
wordpress网站怎么设置关键词深圳保障性住房查询
- 技术栈
- 2026年03月21日






