场景基本绘制类
在OSG中创建几何体的方法比较简单通常有3种处理几何体的手段:一是使用松散封装的OpenGL绘图基元,二是使用OSG中基本几何体,三是从文件中导入场景模型。使用松散封装的OpenGL绘图基元绘制几何体具有很强的灵活性,但工作量通常非常大,当面对大型场景时,绘制几何体将是一项非常艰巨而富有挑战的工作,因此,通常还是采用读入外部模型的方法。读取外部模型的方法在后面会有专门的介绍。
1、向量与数组类
数据类型 | 用途 |
osg::Vec2 | 纹理坐标… |
osg::Vec3 | 点坐标、法向坐标… |
osg::Vec4 | 颜色… |
osg::Vec2Array | 2维数组,保存纹理坐标等 |
osg::Vec3Array | 3维数组,保存点坐标和法向坐标等 |
osg::Vec4Array | 4维数组,保存颜色信息 |
2、Drawable类
Drawable类是一个纯基类,无法实例化。作为可绘制对象基类的osg::Drawable类,它派生了很多类。
-
派生类(9个)
功能
osg::DrawPixels
glDrawPixels()的功能
osg::Geometry
绘制几何体的类
osg::ShapDrawable
已经定义好的几何体
osgParticle::ParticleSystem
粒子系统库
osgParticle::PrecipitationEffect::PrecipitationDrawable
粒子系统库
osgShadow::OccluderGeometry
阴影库
osgShadow::ShadowVolumeGeometry
阴影库
osgSim::ImpostorSprite
osgSim库
osgText::TextBase
文字库
3、PrimitiveSet类
osg::PrimitiveSet类继承自osg::Object虚基类,但它不具备一般场景中的特性。
该类主要松散封装了OpenGL的绘图基元,通过指定绘图基元来指定几何体顶点将采用哪一种或几种基元绘制。需要的绘图基元包括以下几种:
宏名称 | 说明 |
POINTS = GL_POINTS | 绘制点 |
LINES = GL_LINES | 绘制线 |
LINE_STRIP = GL_LINE_STRIP | 绘制多线段 |
LINE_LOOP = GL_LINE_LOOP | 绘制封闭线 |
TRIANGLES = GL_TRIANGLES | 绘制一系列三角形(不共用顶点) |
TRIANGLE_STRIP = GL_TRIANGLE_STRIP | 绘制一系列三角形(共用后面的两个顶点) |
TRIANGLE_FAN = GL_TRIANGLE_FAN | 绘制一系列三角形,顶点顺序与上一个语句绘制的三角形不同 |
QUADS = GL_QUADS | 绘制四边形 |
QUAD_STRIP = GL_QUAD_STRIP | 绘制一系列四边形 |
POLYGON = GL_POLYGON | 绘制多边形 |
从osg::PrimitiveSet类的派生类主要有3个:
-
派生类
说明
osg::DrawArrays
封装了glDrawArrays()顶点数组绘图命令,用于指定顶点和绘制图元
osg::DrawElements
它又派生了3个子类,分别是osg::DrawElementUByte、osg::DrawElementUShort、osg::DrawElementUInt,封装了glDrawElements()的指令,可以起索引的作用
osg::DrawArrayLengths
主要作用是多次绘制,即多次调用glDrawArrays(),且每次均使用不同的长度和索引范围,在绘制过程中用的不是很多。
osg::DrawArrays::DrawArrays(GLenum mode, GLint first, GLSizei count);
// mode:指定绘图基元;
// first:绘制几何体的第一个顶点数在指定顶点的位置数
// 使用的顶点的总数
还有一点值得注意的是,虽然osg::PrimitiveSet类提供与OpenGL一样的顶点机制,但是在内部渲染上还是有一定区别的。根据渲染环境的不同,渲染的方式也是不一样的,可能会采用顶点、顶点数组、显示列表或者glBegin()、glEnd()来渲染几何体,继承自Drawable类的对象(如Geometry)在默认条件下将使用显示列表。其中,osg::Drawable::setUseDisplayList(false)用于手动静止使用显示列表。
还有一种比较特殊的情况,如果设置BIND_PER_PRIMITIVE绑定方式,那么OSG将采用glBegin()、glEnd()函数进行渲染。因为在设置使用绑定方式为BIND_PER_PRIMITIVE后,它就为了每个独立的几何图元设置一种绑定属性。