доступ к объектам в нескольких функциях C ++ - PullRequest
0 голосов
/ 27 августа 2018

Я отделил свою функцию 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 и некоторого массива, который защищает каждую вершину, фрагмент и геометрический шейдер, но, возможно, есть более простой способ, и я просто что-то пропустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...