Шейдер не может быть скомпилирован
Я слежу за книгой "Руководство по программированию OpenGL, 8-е издание". Я просто хочу запустить первую программу, представленную в книге, на моем Mac.
Это Mavericks + Xcode 4.6.1 + Intel HD graphics 4000. Так что проблема в том, что шейдер не может быть скомпилирован.
Коды шейдеров:
#version 410 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}
И сообщение об ошибке:
Shader compilation failed: ERROR: 0:1: '' : version '410' is not supported
ERROR: 0:1: '' : syntax error #version
ERROR: 0:3: 'layout' : syntax error syntax error
Я пробовал версию 420/400/330, ни одна из них не работает.
Кстати, программа использует последнюю версию glew 1.10 ( http://glew.sourceforge.net/), и я обнаружил, что мне нужно установить "glewExperimental = GL_TRUE;" перед вызовом glewInit. В противном случае "glGenVertexArray" является пустым указателем. Так что мне интересно, может быть, Glew не поддерживает Mavericks?
2 ответа
MacOS использует Legacy Profile по умолчанию для всего созданного контекста OpenGL. Поэтому по умолчанию поддерживаются только OpenGL до 2.1 и GLSL до 1.20.
Чтобы использовать OpenGL 3.2+, вам нужно переключиться на основной профиль. Именование там немного сбивает с толку, потому что в нем только профиль 3.2Core, но на самом деле этот 3.2 или более поздний (каждый профиль OpenGL, который поддерживается системой / драйвером и обратно совместим с 3.2)
Для glut (зависит от версии glut, если она работает) команда на MacOS:
glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | ... )
куда | ...
будут другие варианты, которые вы хотите передать glutInitDisplayMode
,
Около glew
обычно вам не требуется glew
на MacOS из-за того, как слой OpenGL реализован в MacOS. Вы ограничены возможностями OpenGL, которые предоставляет / предоставляет MacOS. Так что либо функции доступны через заголовки MacOS, либо нет. Там заголовок будет #include <OpenGL/gl3.h>
где также наименование вводит в заблуждение, это означает не только OpenGL 3, это то же самое, что и контекст.
Я бы порекомендовал использовать GLFW, это отличная кроссплатформенная библиотека, похожая на GLUT
но, как мне кажется, лучше использовать. Там вы бы переключили контекст следующим образом:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
Возможно, ваш драйвер не поддерживает требуемую версию GLSL. У меня была эта проблема на ноутбуке с картой Intel HD при новой установке Ubuntu полгода назад.
Используйте glGetString, чтобы выяснить, какая версия доступна для вас: http://www.opengl.org/sdk/docs/man/xhtml/glGetString.xml. Например,
printf("Supported GLSL version is %s.\n", (char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
Здесь вы можете найти информацию о glewExperimental: http://www.opengl.org/wiki/Extension_Loading_Library