我通过创建新函数main
将loop
函数从循环中分离出来。现在,我遇到了一个问题,我在main
中创建的某些对象无法在loop
中访问。在loop
中创建多个函数参数不是一种选择,因为对于每个Shader和其他对象,它将以类似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();
}
这里的问题是解析函数外部的文件路径会导致在以下位置出现异常:
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;
}
将extern Shader light
切换到Metod并反转会导致与以前相同的错误。
我也许可以使用getter方法和某种可以保护每个顶点,片段和几何体Shader的Array访问着色器,但是也许有一种更简单的方法,我只是错过了一些东西。