Хранение и загрузка матриц в OpenGL
Можно ли сказать OpenGL хранить текущую матрицу преобразования в определенном месте (вместо того, чтобы помещать ее в стек) и загружать матрицу из определенного места?
Я предпочитаю решение, которое не предполагает дополнительной передачи данных между видеоустройством и основной памятью (т. е. лучше хранить матрицу где-то в видеопамяти).
2 ответов:
На старом конвейере фиксированных функций матрицы загружались в некоторые специальные регистры GPU по требованию, но никогда не были в VRAM, все вычисления матрицы происходили на CPU. В наши дни вычисления матрицы OpenGL все еще происходят на CPU (и правильно так), и снова загружаются в регистры, называемые "униформами" по требованию. Однако современный OpenGL также имеет функцию под названием "Uniform Buffer Objects", которая позволяет загружать единообразные (регистровые) значения из VRAM. http://www.opengl.org/wiki/Uniform_Buffer_Object
Но они мало используются для хранения матриц преобразования. Во-первых, вы будете постоянно менять их для создания анимации. Во-вторых, накладные расходы на управление UBOs для простой матрицы съедают гораздо больше производительности, чем настройка ее от процессора. Матрица - это всего лишь 16 скаляров, или эквивалент одной единственной вершины с положением, нормалью, координатой текстуры и атрибутом тангенса.
Чтобы ответить на первую часть вашего вопроса:
Функции glLoadMatrix и glGet могут это сделать
Обратите внимание, что эти функции больше не поддерживаются в OpenGL 4. Матричные операции в любом случае должны выполняться на сайте приложения и предоставляться в качестве однородных переменных шейдерным программам.// get current model view matrix double matrix[16]; glGetDoublev(GL_MODELVIEW_MATRIX, matrix) // manipulate matrix glLoadMatrixd(matrix);
Comments