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

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

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

3 ответа

Решение

Эй, давайте немного замедлиться здесь:) Да, это правда, что вы получаете матрицу 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.

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

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
Другие вопросы по тегам