我在OS X上使用OpenGL Core配置文件。根据我的理解,DebugMessageCallbacks不支持OS X但在4.3版本的开放GL版本中,我在4.1上。所以我必须使用更基本的方法来使用glGetError。
这是我记录输出的方式:
void glCheckError_(const char *p_file, int p_line) {
GLenum error_code;
while ((error_code = glGetError()) != GL_NO_ERROR)
{
std::string error;
switch (error_code)
{
case GL_INVALID_ENUM: error = "INVALID_ENUM"; break;
case GL_INVALID_VALUE: error = "INVALID_VALUE"; break;
case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break;
case GL_STACK_OVERFLOW: error = "STACK_OVERFLOW"; break;
case GL_STACK_UNDERFLOW: error = "STACK_UNDERFLOW"; break;
case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break;
case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break;
}
std::cout << error << " | " << p_file << " (" << p_line << ")" << std::endl;
}
}
我使用的快捷方式宏:
#define glCheckError() glCheckError_(__FILE__, __LINE__)
我的openGL应用程序编译,它运行,但没有任何渲染。我几乎在每个openGL调用下抛出了glCheckError(),在glfw初始化之后我只得到1个错误,那就是:
INVALID_ENUM | /Users/ddodds/CLionProjects/salem-gdk/salem/system/GameLoop.cpp (139)
根据我的理解,这只是在初始化之后发生的事情,可以忽略。但是,万一我错了,这就是发生错误的地方:
在游戏循环之前调用甚至开始迭代,在glfw / glad初始化之后:
void GameLoop::Run()
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glEnable(GL_BLEND);
glCheckError(); // This is the error
没有任何opengl错误,为什么我的应用程序没有渲染,尝试调试应用程序的下一步是什么?解决这类问题的最佳方法是什么?我是OpenGl及其工具的新手。
答案 0 :(得分:0)
我怀疑GL_INVALID_ENUM是由glEnable(GL_DEBUG_OUTPUT);
或glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
生成的,因为(你说过)4.1上不支持glDebugMessageCallback - 因此你无法启用它。 OpenGL4参考说glEnable生成错误:
如果上限不是列出的值之一,则会生成GL_INVALID_ENUM 先前。
如果其余代码没有错误,您可能需要检查是否已设置所有内容(并正确设置)。 OpenGL是类似于库的状态机,很容易省略某些东西(未设置glViewport,未启用顶点数组,帧缓冲不完整,未设置矩阵的均匀等等)。但是,有很多可能的失败地点,如果没有显示更多的代码,很难给出任何可靠的提示。