如何调试我的OpenGl问题

时间:2018-01-29 16:16:59

标签: c++ debugging opengl

我在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及其工具的新手。

1 个答案:

答案 0 :(得分:0)

我怀疑GL_INVALID_ENUM是由glEnable(GL_DEBUG_OUTPUT);glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);生成的,因为(你说过)4.1上不支持glDebugMessageCallback - 因此你无法启用它。 OpenGL4参考说glEnable生成错误:

  

如果上限不是列出的值之一,则会生成GL_INVALID_ENUM   先前。

如果其余代码没有错误,您可能需要检查是否已设置所有内容(并正确设置)。 OpenGL是类似于库的状态机,很容易省略某些东西(未设置glViewport,未启用顶点数组,帧缓冲不完整,未设置矩阵的均匀等等)。但是,有很多可能的失败地点,如果没有显示更多的代码,很难给出任何可靠的提示。