Шейдер не может быть скомпилирован

Я слежу за книгой "Руководство по программированию 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

Другие вопросы по тегам