Как вы получаете модели и матрицы проекций в OpenGL? - PullRequest
27 голосов
/ 17 ноября 2010

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

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

Ответы [ 3 ]

59 голосов
/ 17 ноября 2010

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

10 голосов
/ 17 ноября 2010

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

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
1 голос
/ 17 ноября 2010
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...