Я отделил свою функцию main
от ее цикла, создав новую функцию loop
. Теперь у меня проблема с тем, что некоторые объекты, которые я создал в main
, не доступны в loop
. Создание нескольких параметров функции в loop
не вариант, потому что для каждого шейдера и других объектов это будет около 30 и более параметров. Итак, я сделал объекты глобальными:
main.cpp
Shader light("Shaders/light.shader");
Shader depth("Shaders/depth.shader");
Shader.cpp
Shader::Shader(const std::string& filePath)
{
source = parseShader(filePath);
if (shaderGeometry)
ID = createShader(source.vertexSource, source.fragmentSource, source.geometrySource);
else
ID = createShader(source.vertexSource, source.fragmentSource);
use();
}
Проблема в том, что при анализе путей к файлам вне функции возникает исключение at:
int Shader::createShader(const std::string& vertexShader, const std::string& fragmentShader)
{
program = glCreateProgram(); //<-- HERE
//some further code...
}
vertexShader
и fragmentShader
анализируются правильно, поэтому проблем нет.
Я предполагаю, что exception
выбрасывается, потому что шейдеры должны быть созданы внутри функции, в которую указатели функций GL загружаются раньше.
Я пытался поиграть с extern
. Но что-то вроде этого просто оставляет ошибку компиляции:
глобальная переменная
extern Shader light;
extern Shader depth;
в функции
int main()
{
Window wnd(width, height);
Shader light("Shaders/light.shader");
Shader depth("Shaders/depth.shader");
wnd.loop();
//some further code
return 0;
}
Swithing extern Shader light
для Метода и обратное приведет к той же ошибке, что и раньше.
Возможно, я мог бы получить доступ к шейдеру с помощью метода get и некоторого массива, который защищает каждую вершину, фрагмент и геометрический шейдер, но, возможно, есть более простой способ, и я просто что-то пропустил.