OSG学习过程中的笔记 - 图文 下载本文

还可以设置判断视点到物体之间的距离单位是长度距离还是像素个数。 5.开关节点

使用osg::Switch节点可以渲染或者跳过指定的子节点。 四渲染状态

用户的应用程序需要在osg::StateSet中设置渲染状态。StateSet能够自动对状态进行优化,并可以关联到场景图形中的任意一个节点或Drawable类。

用户需要尽量使关联到场景图形的StateSet最少化。 Osg渲染状态的两部分:渲染属性和渲染模式。

渲染模式是指渲染的某个功能,而渲染属性是这个功能的控制变量和参数。 如果要设置渲染状态的值,用户程序需要执行以下几步操作:

1.为将要设置状态的Node或Drawable对象提供一个StateSet实例。 2.在StateSet实例中设置状态的渲染模式和渲染属性。 渲染属性(Attribute)和渲染模式(mode) Osg为每个状态属性定义了不同的类,以便应用程序采用,所有的属性类均继承自osg::StateAttribute,StateAttribute是一个无法直接实例化的虚基类。

Osg将所有的属性和模式分成两大部分:纹理和非纹理。 设置渲染属性

如果要设置一项属性,首先将要修改的属性类实例化。设置该类的数值,然后用osg::StateSet::setAttribute()将其关联到StateSet。

设置渲染模式

可以使用Osg::StateSet::setMode()允许或禁止某种模式。 设置渲染属性和模式

如果要将某个属性关联到StateSet,同时打开其对应模式的许可,那么可以使用osg::StateSet::setAttributeAndModes()方法。

状态继承

当你设置节点的渲染状态时,这个状态将被赋予当前的节点及其子节点。如果子节点对同一个渲染状态设置了不同的属性参数,那么新的子节点状态参数将会覆盖原有的。换句话说,缺省情况下子节点可以改变自身的某个状态参数,或者继承父节点的同一个状态。

Osg允许用户根据场景图形中任意位置的渲染属性和模式需求,而单独改变原有的状态继承特性。用户可以选择以下这几种枚举形式:

Osg::setAttribute::OVERRIDE:所有的子节点都将继承这一属性或模式,子节点对他们更改将会无效。

Osg::setAttribute::PROTECTED:视为OVERRIDE的一个例外,凡是设为这种形式的属性或模式都不会受到父节点的影响。

Osg::setAttribute::INHERIT:这种模式强制子节点继承父节点的渲染状态。其效果是子节点的渲染状态被解除,而使用父节点的状态代替。

纹理与映射

为了在程序中实现基本的纹理映射功能,用户的代码需要支持以下的步骤: 1. 指定用户几何体的纹理坐标

2. 创建纹理属性对象并保存纹理图形信息 3. 为StateSet设置合适的纹理属性和模式 1. 纹理坐标:

Geometry类同时还允许用户程序指定一个或多个纹理坐标数据数组。指定了纹理坐标之后,还要指定相应的纹理单元,osg使用纹理单元来实现多重纹理。(多重纹理就是在渲染一个多边形的时候可以用到多张纹理图.把多张纹理图进行一些颜色的操作,可以达到一些效果.但是多重纹理必须是在显卡支持的情况下.)

Osg并不支持非多重纹理接口。因此,用户程序必须制定一个纹理单元,以对应纹理坐标数据和纹理状态。如果要使用单一纹理的话,只需要制定到纹理单元0即可。

2. 读取图像

用户程序可以使用两个类来实现基本的2d纹理映射:osg::Texture2D和osg::Image,

Texture2D属于setAttribute的派生类,用于管理OpenGL纹理对象,而Image用于管理图像像素数据。如果要使用2d图像文件作为纹理映射的图形,只要将文件名赋给Image对象并将Image关联到Texture2D即可。

3. 纹理状态

用户可以使用osg::StateSet::setTextureAttribute()将一个纹理属性关联到StateSet对象。setTextureAttribute()的第一个参数是纹理单元,第二个参数是继承自StateAttribute类的一种纹理属性。合法的属性纹理类有六种:五种纹理类型osg::Texture1D,osg::Texture2D, osg::Texture3D,osg::TextureCubeMap,osg::TextureRectangle,另一个是用于纹理坐标的生成osg::TexGen。

五光照

要在应用程序中使用光照,需要遵循下面的步骤: 1. 指定几何体法线

2. 允许光照并设定光照状态

3. 指定光源属性并关联到场景图形 4. 指定表面材质属性 法线

光照状态

光源:定义一个osg::Light对象以定义光源参数。然后将Light添加到osg::LightSource节点中,并将LightSource添加到场景图形。由Light定义的光源将对整个场景产生影响。

材质属性:osg::Material封装了OpenGL中的glMatrial()和glColorMaterial()指令的函数功能。要允许颜色追踪材质的特性,需要调用Material::setColorMode()方法。

六文件I/O

osgDB库提供了用户程序读取和写入2D图形和3D模型文件的函数接口。osgDB库还负责管理osg的插件系统,以实现对不同文件格式的支持。

1. 接口

osgDB提供了文件I/O的函数接口,从而将插件系统完全影藏在用户程序之外。

需要的两个头文件是: osgDB/ReadFile osgDB/WriteFile

读取文件:使用函数osgDB::readNodeFile(string & filename)(3d模型文件的读取)和osgDB::readImageFile(string & filename)(2d图像的读取)来读取3d模型和2d图像文件。

readNodeFile()返回一个指向场景图形节点的指针。readImageFile()返回Image对象的指针。

写入文件:利用函数osgDB::writeNodeFile()和osgDB::writeImageFile()将数据写入到3d模型或2d图像文件中。

插件的检索和注册:osg插件也就是一组动态链接库,其中实现了osgDB头文件ReadFile定义的接口。Registry类维护了一个扩展名的化名映射表来对应不同的文件格式和支持此类格式的插件。

七 NodeKit与osgText

Osg库提供了丰富的设计功能,不过有时还是需要从osg的核心节点类中派生出自己的特定节点。而这些派生的功能往往不属于osg核心部分,而是适合作为辅助的库存在。

所谓NodeKit就是指一种开发集成库,它扩展自osg核心功能的特定节点类(Node),渲染属性类(StateAttribute),绘图类(Drawable),并且使用osg包装类(wrapper)对这些新的功能类提供.osg文件格式的支持。

osgText组件:在这个命名空间中有一些十分使用的加载字体和文字渲染类。 核心类:Text:继承自Drawable类,可用于显示任意长度的字符串。 Font:osgText的函数可以根据字体文件的名称来创建Font对象。 要在程序中使用osgText,用户通常要遵守下面的三个步骤:

1. 如果要使用一种字体显示多行文字,只需要创建一个Font对象,然后在Text对象之间共享即可。

2. 为每一段要显示的字符串建立一个Text对象。指定对齐方式,文字方向,位置和大小参数,将步骤一中的Font对象关联到新的Text对象中。

3. 使用addDrawable函数将Text对象添加到Geode节点。用户可以向一个Geode节点添加多个Text对象,或者根据自己的需要创建多个Geode节点。将Geode节点作为场景图形的子节点加入。

坐标位置:利用Text::setPosition()改变在原点的默认值。

文字方向:可以使用Text::setAxisAlignment方法来设置文字的位置。输入参数为Text::AxisAlignment的枚举量。

对齐方式:使用函数Text::setAlignment()参数是Text::AlignmentType枚举量。

文字尺寸: 分辨率:

颜色:Text::setColor()设置颜色 .osg文件格式:

osg笔记三

2011-07-10 11:41:02| 分类:OSG | 标签: |字号大中小订阅

在用户程序中使用osg 一.渲染

Osg开放了所有的功能模块。因此用户程序完全可以使用最底层的osg功能来执行渲染操作。假设用户希望能够完全自主的控制场景图形的渲染,那么也可以按照下面的步骤编写应用程序的代码:

1. 设计自己的视角管理代码:以改变OpenGL的模型视图矩阵。

2. 创建用户窗口和OpenGL上下文,并将他们激活。如果有需要的话,用户也可以自行编写管理多窗口和多个设备上下文的代码。

3. 如果应用程序需要使用分页数据库,那么可以使用osgDB::DatabasePager类

4. 可以将osgUtil::UpdateVisitor,osgUtil::CullVisitor,osgUtil::RenderStage对象实例化,以实现场景的更新,挑选和绘制遍历。如果用户希望获得更多的控制权,则可以自己编写类来实现以上遍历的特性。

5. 编写主循环代码来处理操作系统返回的事件。并且调用自己的视角观察代码来更新模型视图矩阵。

6. 在渲染一帧之前先要调用glClear()。渲染时要依次执行场景更新,挑选和绘制遍历,最后交换缓存数据。

7. 如果用户程序或者运行改程序的软﹑硬件平台需要立体化渲染(stereo rendering)或者多通道渲染(multipipe rendering)功能的支持,则可以自行编写额外的代码。

8. 最后请依照平台无关性的要求来编写所有的代码,这样你的代码才可以在所有的目标平台上运行通过。

用户使用osg时,往往可以利用以下这些工具和库来简化开发的过程:

1. osgUtil::SceneView:这个类封装了更新,挑选,和绘制遍历,但是并不启用DatabasePager。有一部分应用程序会使用SceneView作为osg渲染的主接口。

2. Producer和osgProducer—Producer是一个外部的摄像机库,可以支持多通道渲染。osgProducer是一个集成了Producer和osg的应用库。Producer有相当多的用户,目前有一部分的osg程序是基于osgProducer和Producer开发的。

Osg2.0版本核心添加了一个新的库成员—osgViewer。osgViewer包含了一系列的用于控制视口显示的相关的类,并封装了大量用户常用的功能函数,例如显示管理,事件响应,场景渲染等。这个库使用osg::Camera类来管理OpenGL的模型视图矩阵。与SceneView类不同,osgViewer的视口类提供了对DatabasePager的全部支持。osgViewer还可以针对同一个场景图形,提供并通过多个独立的视口显示该场景。

3.1.1 Viewer类 改变视口: