Подтвердить что ты не робот

Как получить модельные и проекционные матрицы в OpenGL?

Я пытаюсь использовать OpenGL Shading Language (GLSL) версии 1.5 для создания шейдеров вершин и геометрий.

Я узнал, что в GLSL версии 1.5 встроенные переменные, такие как gl_ModelViewProjectionMatrix, устарели, поэтому вам нужно передать их вручную. Если я уже задал матрицу модели и проекции (например, используя gluLookAt и gluPerspective), то как мне получить матрицы, чтобы они переходили в вершинные и геометрические шейдеры? Я сделал несколько поисков, и некоторые сайты, похоже, упоминают функцию glGetMatrix(), но я не могу найти эту функцию в какой-либо официальной документации, и она, похоже, не существует в реализации, которую я использую (я получаю компиляцию ошибка unknown identifier: glGetMatrix, когда я пытаюсь скомпилировать ее с этой функцией).

4b9b3361

Ответ 1

Эй, позвольте немного замедлиться здесь:) Да, это правда, что вы получаете матрицу от glGetFloatv(GL_MODELVIEW_MATRIX, ptr)... Но это определенно не то, что вы должны здесь делать!

Позвольте мне объяснить:

В GLSL встроенные переменные типа gl_ModelViewProjectionMatrix или такие функции, как ftransform(), устарели - это правильно, но это только потому, что стек целых матриц устарел в GL 3.x, и вы "Предполагается, что вы используете свой собственный стек матрицы (или используете любое другое решение, стек матрицы полезен, но не обязательно!).

Если вы все еще используете стек матриц, вы полагаетесь на функциональность OpenGL 2.x или 1.x. Это хорошо, поскольку все это по-прежнему поддерживается на современных графических картах из-за профиля совместимости GL - хорошо перейти на новую версию GL, но вы можете остаться с этим на данный момент.

Но , если вы используете более старую версию OpenGL (с матричным стеком), также используйте более старую версию GLSL. Попробуйте 1.2, потому что более высокие версии (включая ваш 1.5) предназначены для совместимости с OpenGL3, где в OpenGL больше не существуют такие вещи, как матрицы проектирования или модели, и, как ожидается, будут переданы явно как пользовательские, определяемые пользователем переменные uniform, если это необходимо.

Соответствие между версиями OpenGL и GLSL было немного сложным (прежде чем они очистили нумерацию версий для соответствия), но она должна быть более или менее похожей на:

GL    GLSL

4.1 - 4.1
4.0 - 4.0
3.3 - 3.3
3.2 - 1.5
3.1 - 1.4
3.0 - 1.3
2.x and lower - 1.2 and lower

Итак, длинный рассказ - шейдерная униформа устарела, потому что соответствующая функциональность в OpenGL также устарела; либо перейти на более высокую версию OpenGL или более низкую версию GLSL.

Ответ 2

Чтобы получить любую матрицу, вы используете константы GL_MODELVIEW_MATRIX или GL_PROJECTION_MATRIX с glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 

Ответ 3

float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);