osg.DrawElements
是OpenSceneGraph中一个重要的绘制图形元素的类。该类封装了OpenGL的绘制指令,使得使用者可以方便地绘制各种图形元素。该类常常被用于三角形网格、线段、点等绘制场景中。
使用osg::DrawElements
类,需要通过相应osg::PrimitiveSet::Type
和顶点数量来创建一个对象。
osg::ref_ptr<osg::DrawElements> drawElements = new osg::DrawElements(osg::PrimitiveSet::TRIANGLES, 0);
上述代码创建了一个绘制三角形网格的对象。其中,osg::PrimitiveSet::TRIANGLES
表明绘制的是三角形,0
表明顶点数量是0,此时我们并未设置任何顶点。
绘制图形元素,就必然需要设置对应的顶点数据。我们可以通过addPrimitiveSet
函数,向osg::DrawElements
对象中添加任意数量的顶点数据。在添加之后,能通过getNumIndices
函数获得数据的总数。
drawElements->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, 3));
上述代码添加了三个顶点,这三个顶点将构成一个三角形。
通过osg::Geometry
对象,能够对顶点进行变换和着色,最终通过osg::Drawable
对象绘制出完整的图形元素。
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(vertexArray);
geom->addPrimitiveSet(drawElements);
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(geom);
上述代码创建了一个包含顶点数组和osg::DrawElements
对象的几何体,并将其添加到场景图节点中。
OpenGL中的顶点着色模型,需要为每个顶点添加颜色和法线。在OpenSceneGraph中,能通过setColorArray
和setNormalArray
函数分别设置顶点颜色数组和法线数组。设置之后,需要分别打开数组的使用状态。
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
geom->setColorArray(colors);
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
geom->setNormalArray(normals);
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
上述代码为顶点数组分别添加了一个白色颜色和一个法线。这里使用了BIND_OVERALL
枚举类型表示整个几何体的颜色和法线,如果需要对每个顶点单独设置颜色和法线,可以使用BIND_PER_VERTEX
枚举类型。