Хранение и загрузка матриц в OpenGL



Можно ли сказать OpenGL хранить текущую матрицу преобразования в определенном месте (вместо того, чтобы помещать ее в стек) и загружать матрицу из определенного места?

Я предпочитаю решение, которое не предполагает дополнительной передачи данных между видеоустройством и основной памятью (т. е. лучше хранить матрицу где-то в видеопамяти).

111   2  

2 ответов:

На старом конвейере фиксированных функций матрицы загружались в некоторые специальные регистры GPU по требованию, но никогда не были в VRAM, все вычисления матрицы происходили на CPU. В наши дни вычисления матрицы OpenGL все еще происходят на CPU (и правильно так), и снова загружаются в регистры, называемые "униформами" по требованию. Однако современный OpenGL также имеет функцию под названием "Uniform Buffer Objects", которая позволяет загружать единообразные (регистровые) значения из VRAM. http://www.opengl.org/wiki/Uniform_Buffer_Object

Но они мало используются для хранения матриц преобразования. Во-первых, вы будете постоянно менять их для создания анимации. Во-вторых, накладные расходы на управление UBOs для простой матрицы съедают гораздо больше производительности, чем настройка ее от процессора. Матрица - это всего лишь 16 скаляров, или эквивалент одной единственной вершины с положением, нормалью, координатой текстуры и атрибутом тангенса.

Чтобы ответить на первую часть вашего вопроса:

Функции glLoadMatrix и glGet могут это сделать

// get current model view matrix
double matrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, matrix)

// manipulate matrix

glLoadMatrixd(matrix);
Обратите внимание, что эти функции больше не поддерживаются в OpenGL 4. Матричные операции в любом случае должны выполняться на сайте приложения и предоставляться в качестве однородных переменных шейдерным программам.
    Ничего не найдено.

Добавить ответ:
Отменить.