osg库的scenedata是个以osg::node为基类组织的节点树,叶子节点是osg::geometry 类。
geometry类有一系列的方法:
setVertexArray,
setColorArray
setNormalArray
…
setPrimitiveSet
用于设置顶点坐标,顶点颜色,顶点纹理坐标和法向量,索引等等,图元类型为GPU能绘制的基本类型,点、线段、三角形集合(点,线段,三角形,这和opengl里面的定义一致)。
调setUseVertexBufferObject(true)设置使用vbo,setUseDisplaylist(false)不使用displaylist。
在frame()中遍历到叶子节点, 将在drawImplement方法中创建vbo(glGenBuffer,glBindBuffer,glBufferSubData)和ebo,调用glDrawArray或者glDrawElements绘制。
修改geometry是通过geometry的getVertexArrary,getColorArray这类方法得到坐标或者颜色法向量数组然后修改数据后调dirty()通知数据改变了,将在下次frame调glBufferSubData修改GPU中对应的数据。
上面是opengl4.x之前兼容模式,如果用opengl4.x以后,写glsl着色器则在顶点着色器中写:
layout (location = 0) in vec3 vtPos;
layout (location = 1) in vec4 vtColor;
…
int main()
{…}
然后代码中
geo->setUseVertexArrayObject(true);//使用vao
osg::Vec3Array* pos = new osg::Vec3Array();
//填写坐标数据
geo->setVertexAttribArray(0,pos); //pos指定为片元着色器的vtPos
geo->setVertexAttribBinding(0,bindperveretx);
osg::Vec4Array* color = new osg::Vec4Array();
填写颜色数据
geo->setVertexAttribArray(1,color);//color指定为片元着色器的vtColor
geo->setVertexAttribBinding(1,bindperveretx);
这样很多接口都不用了。