Ответ 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.