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