OpenGL не имеет понятия «модели шейдеров»; это вещь Direct3D. Он имеет только версии GLSL: 1.10, 1.20 и т. Д.
Каждая версия OpenGL соответствует определенной версии GLSL. GL 2.1 поддерживает GLSL 1.20. GL 3.0 поддерживает GLSL 1.30. Для GL 3.3 и выше, они перестали дурачиться и просто использовали тот же номер версии, поэтому GL 3.3 поддерживает GLSL 3.30. Таким образом, между GLSL 1.50 (соответствует GL 3.2) и GLSL 3.30 существует странный разрыв в номере версии.
Технически, реализациям OpenGL разрешено отказываться от компиляции более старых версий шейдеров, чем те, которые соответствуют текущей версии. Однако на практике вы можете в значительной степени внедрить любой шейдер GLSL в любую реализацию OpenGL, если версия шейдера меньше или равна версии, поддерживаемой реализацией OpenGL. Это не было протестировано на MacOSX Lion с реализацией ядра GL 3.2.
Существует одно исключение: основные контексты . Если вы попытаетесь передать шейдер через основной контекст OpenGL, который использует функции, удаленные из ядра, он будет жаловаться.
Нет способа заставить OpenGL предоставить вам определенную версию OpenGL. Вы можете задать это с помощью wgl / glXCreateContextAttribs. Но это позволяет вам получить любую версию выше той, которую вы запрашиваете, при условии, что эта версия обратно совместима с тем, что вы просили.