Я пытаюсь создать приложение OpenGl. Сначала я использовал старый конвейер с фиксированными функциями для рисования. Тогда я заметил, что это устарело, и захотел перейти на программируемый конвейер. Для этого я использовал несколько учебных пособий в Интернете. После изменения своего кода я попытался скомпилировать его, но мой компилятор не смог найти функции (основной профиль?), Такие как glShaderSource, glCompileShader, glCreateProgram, glAttachShader, glLinkProgram и некоторые другие. Я не использую библиотеку GLFW для управления окнами или что-то подобное, кроме xlib.
glxinfo | grep OpenGl печатает следующее:
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GTX 675M/PCIe/SSE2
OpenGL core profile version string: 4.3.0 NVIDIA 331.113
OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 4.4.0 NVIDIA 331.113
OpenGL shading language version string: 4.40 NVIDIA via Cg compiler
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
Я попробовал как проприетарный драйвер Nvidia, так и драйвер с открытым исходным кодом, но это не решило проблему.
Я включаю заголовки OpenGl следующим образом:
#include <GL/gl.h>
#include <GL/glx.h>
Вот некоторые из выводимых ошибок компиляции:
In file included from main.cpp:1:0:
../../gui/iml/app.window.h: In constructor ‘gui::iml::AppWindow::AppWindow()’:
../../gui/iml/app.window.h:65:52: error: ‘glCreateShader’ was not declared in this scope
fragmentShader = glCreateShader(GL_VERTEX_SHADER);
^
../../gui/iml/app.window.h:66:47: error: ‘glShaderSource’ was not declared in this scope
glShaderSource(vertexShader,1,&vshader,NULL);
^
../../gui/iml/app.window.h:67:32: error: ‘glCompileShader’ was not declared in this scope
glCompileShader(vertexShader);
^
../../gui/iml/app.window.h:72:38: error: ‘glCreateProgram’ was not declared in this scope
GLuint sprogram = glCreateProgram();
^
../../gui/iml/app.window.h:73:50: error: ‘glAttachShader’ was not declared in this scope
glAttachShader(this->shaderProg,fragmentShader);
^
../../gui/iml/app.window.h:75:34: error: ‘glLinkProgram’ was not declared in this scope
glLinkProgram(this->shaderProg);
Я компилирую тестовую программу, которую я создал для отладки, следующим образом:
g++ -Wall -Winline -DDEBUG main.cpp -I ../../gui/ -o debug -lX11 -lGL -lGLU -pthread -std=c++11
Я думаю, что сделал простую и глупую ошибку, но я не понимаю …
редактировать:
Я посмотрел в свой файл gl.h, и он увидел, что он из проекта Mesa:
/*
* Mesa 3-D graphics library
*
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
* Copyright (C) 2009 VMware, Inc. All Rights Reserved.
*
Разве это не должны быть заголовочные файлы драйвера Nvidia?
РЕШИТЬ:
Мне пришлось скачать заголовочный файл gl3.h отсюда: https://www.khronos.org/registry/gles/api/old/3.0/gl3.h и переместите его в / usr / include / GL /
Затем я установил файлы разработки OpenEs через:
sudo apt-get install libgles2-mesa-dev
и теперь программа компилируется!
Несмотря на то, что ваша проблема может исчезнуть на первый взгляд, вы на самом деле не решили основную причину (по крайней мере, если вы стремитесь к соответствию LSB4, из чистой удачи, используя только функции glShader…, ваша программа фактически соответствует LSB5).
Проблема, с которой вы сталкиваетесь, заключается в том, что База стандартов Linux (LSB) определяет только OpenGL-1.2 в качестве обязательного набора функций, включаемых в системный ABI. * Любой символ, выходящий за пределы OpenGL-1.2, не является частью стандартного набора функций, которые вы можете ожидать в настольной системе Linux. Недавно был выпущен LSB5, что повышает требования к OpenGL-2.1.
Во всяком случае, любая функция, которая находится за пределами того, что определено в LSB должен (Я повторяю ДОЛЖЕН) разрешаться динамически во время выполнения и проверяться на доступность. Если вы этого не сделаете, ваша программа будут сломаться на чужих системах в конце концов.
Соответствующие функции для разрешения символов glXGetProcAddress
(или же wglGetProcAddress
соответственно на винде). Не делайте включить определение прототипа gl3.h
… только боль и страдания идут по этому пути. Вместо этого, чтобы обезопасить себя, используйте должным образом протестированную библиотеку загрузчика OpenGL, такую как GLEW (имеет много проблем) или glLoadGen / glload (Я рекомендую использовать позже).