У меня есть стандартный граф сцены, написанный на opengl с использованием c ++.
В моем графе сцены есть узлы и формы.
Узлы - это матрицы, и после применения их матрицы они рисуют всех своих потомков.
void Node::draw(Affine3f amatrix) const
{
amatrix = amatrix * matrix;
for (Drawable* child : childern)
{
child->draw(amatrix);
}
}
Фигуры - это просто упакованные vbos, они берут матрицу из вызова draw, устанавливают ее какединая матрица просмотра модели, а затем нарисовать VBO.
void Shape::draw(Affine3f mat) const
{
renderer.setModelView(mat);
myVertices.draw();
}
Мне нравится этот дизайн, он очень прост и гибок.Но это очень неэффективно, с тоннами умножения матриц на стороне процессора и тоннами вызовов отрисовки.
Мой вопрос:
Как я могу оптимизировать этот дизайн, удалив обе ненужные матрицыумножения и ненужные вызовы отрисовки?
Как не пересчитывать матрицы при каждом отрисовке (вычисляются только измененные) и объединять фигуры, чтобы их можно было нарисовать одним вызовом.
Еще немного информации:
- Фигуры статичны (на данный момент), содержащиеся вершины никогда не изменятся.
- Существует смесь статической геометрии (в реальном времени в корневом узле без манипуляций) и динамической геометрии (дети манипулируемых узлов)