osg::DrawArrays
是一个图元渲染命令,用于向场景图中添加基本几何体(例如点、线和三角形)。
osg::DrawArrays
可用于绘制一群指定几何体的简单连续序列,序列中每个成员的几何体类型相同,且每个成员的顶点数以及其在缓冲区中的位置也相同。
你可以使用osg::DrawArrays
在一个场景中多次渲染同一个实体,并且可以在相同实体的不同部分使用相同的纹理目标。在某些情况下,相对于多个单个几何体节点,绘制数组的使用可以减少场景图中的节点数量。
使用osg::DrawArrays
时,需要指定以下内容:
GL_POINTS
、GL_LINES
、GL_TRIANGLES
、GL_QUADS
等)下面的示例代码创建一个简单的网格平面,并使用osg::DrawArrays
来渲染它:
osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-5,-5,0));
vertices->push_back(osg::Vec3( 5,-5,0));
vertices->push_back(osg::Vec3( 5, 5,0));
vertices->push_back(osg::Vec3(-5, 5,0));
osg::Geometry* grid = new osg::Geometry;
grid->setVertexArray(vertices);
osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_TRIANGLE_FAN,0,4);
grid->addPrimitiveSet(drawArrays);
osg::Geode* geode = new osg::Geode;
geode->addDrawable(grid);
osg::Group* root = new osg::Group;
root->addChild(geode);
在上面的示例代码中,我们首先创建一个包含四个顶点的顶点数组。然后,我们创建一个几何体对象osg::Geometry
,将顶点数组设置为该几何体对象的顶点数组。接着,我们使用osg::DrawArrays
创建基元类型为GL_TRIANGLE_FAN
、起始索引为0、终止索引为4(不包括4)的数组渲染命令。最后,我们将新建的数组渲染命令添加到几何体对象中。
你可以使用以下方法操纵顶点数组:
osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-5,-5,0));
vertices->push_back(osg::Vec3( 5,-5,0));
vertices->push_back(osg::Vec3( 5, 5,0));
vertices->push_back(osg::Vec3(-5, 5,0));
vertices->pop_back();
vertices->insert(vertices->begin() + 1, osg::Vec3(0,-5,0));
vertices->erase(vertices->begin() + 2);
你可以指定以下基元类型:
GL_POINTS
:绘制一组单独的点GL_LINES
:绘制一组连接的线段。假设vertices
的大小为$n$,则线段由$n/2$个点组成:第一个和第二个点绘制第一条线,第三个和第四个点绘制第二条线,以此类推。GL_LINE_STRIP
:绘制一条带状线条。假设vertices
的大小为$n$,则线条由$n-1$个点组成:第一条线由第一个和第二个点绘制,第二条线由第二个和第三个点绘制,依此类推。GL_LINE_LOOP
:与GL_LINE_STRIP
类似,不同之处在于结束时闭合线段。GL_TRIANGLES
:绘制由三角形组成的图元。假设vertices
的大小为$n$,则每个三角形由3个连续的点组成。因此,需要有$n/3$个点才能完全绘制所有的三角形。GL_TRIANGLE_STRIP
:绘制由三角形组成的带状图元。假设vertices
的大小为$n$,则第一个三角形由第一个、第二个和第三个点组成,第二个三角形由第二个、第三个和第四个点组成,以此类推,有$n-2$个三角形。GL_TRIANGLE_FAN
:绘制由三角形组成的扇形图元。假设vertices
的大小为$n$,则第一个三角形由第一个、第二个和第三个点组成,第二个三角形由第一个、第三个和第四个点组成,以此类推,有$n-2$个三角形。GL_QUADS
:绘制由四边形组成的图元。假设vertices
的大小为$n$,则每个四边形由4个连续的点组成。因此,需要有$n/4$个点才能完全绘制所有的四边形。GL_QUAD_STRIP
:绘制由四边形组成的带状图元。假设vertices
的大小为$n$,则每个四边形由4个点组成,相邻的两个四边形共享两个连接点,因此需要有至少4个点。GL_POLYGON
:绘制由多边形组成的图元。需要使用特殊的顶点组织方式,其中第一个顶点连接到第二个、第三个直到第$n$个顶点,最后一个顶点要连接到第一个顶点。因此,需要有$n$个点才能完全绘制多边形。在osg::DrawArrays
的drawArrays()
方法中,你可以通过指定起始顶点和绘制的顶点数量来限制几何体中要渲染的部分。
osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_TRIANGLE_FAN,1,3);
// 从第二个点开始,绘制3个点渲染三角形
grid->addPrimitiveSet(drawArrays);
对于不同的图元类型,你需要指定不同的起始索引和数量,来绘制不同的形状。