我有一个用C++编写的OpenGL标准场景图。
我的场景图有节点和形状。
节点是矩阵,应用它们的矩阵后,它们会绘制所有子节点。
void Node::draw(Affine3f amatrix) const
{
amatrix = amatrix * matrix;
for (Drawable* child : childern)
{
child->draw(amatrix);
}
}
形状就是简单的打包好的VBO,它们会从绘制调用中获取矩阵,并将其设置为统一的模型视图矩阵,然后绘制VBO。
void Shape::draw(Affine3f mat) const
{
renderer.setModelView(mat);
myVertices.draw();
}
我喜欢这个设计,它非常简单灵活。但是,它非常低效,需要进行大量的CPU端矩阵乘法计算和绘制调用。
我的问题是:
如何优化此设计,同时消除不必要的矩阵乘法和绘制调用?
例如,仅在更改时计算矩阵而不是每次绘制重新计算,并将形状合并以便可以使用一次调用进行绘制。
一些更多的信息:
- 形状是静态的(目前为止),包含的顶点将永远不会改变。
- 存在静态几何体(位于根节点且未经操作)和动态几何体(操作节点的子元素)的混合。