OSG学习笔记-场景基本绘制类(3-1)

 场景基本绘制类

        在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后,它就为了每个独立的几何图元设置一种绑定属性。

你可能感兴趣的:(OSG,学习,c++,opengl)