【问题标题】:How to debug my OpenGl Issue如何调试我的 OpenGL 问题
【发布时间】:2018-01-29 16:16:58
【问题描述】:

我在 OS X 上使用 OpenGL Core 配置文件。据我了解,在 OS X 上尚不支持 DebugMessageCallbacks,但在 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 和它的工具相当陌生。

【问题讨论】:

  • 在 OGL 中,每个错误都很重要,不要忽略它们。
  • 在 OSX 上有用:apitraceXcode tools

标签: c++ debugging opengl


【解决方案1】:

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

如果 cap 不是列出的值之一,则会生成 GL_INVALID_ENUM 以前。

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

【讨论】:

  • 感谢您的回复,但我的问题是“我该如何调试它”,“不是什么解决方案”。我做了一些挖掘,我发现一些关于在 opengl 中看不到渲染的常见问题是它们可能不在我试图渲染的视口内,这就是我的问题。我的相机的数学是关闭的。如果出现这样的问题,我怎样才能让它们更容易找到?
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2011-07-10
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多