【问题标题】:Segmentation Fault when using some OpenGL functions使用某些 OpenGL 函数时出现分段错误
【发布时间】:2021-08-19 01:33:13
【问题描述】:

我在渲染循环中使用 OpenGL 函数时遇到问题。
这是我的代码:

// This works, I have glad in an include folder with glad headers in it
#include "include/glad/glad.h" 
#include <GLFW/glfw3.h>
#include <iostream>


int main(int argc, char *argv[])
{
    if (!glfwInit())
    {
        std::cerr << "Failed to initialise GLFW !" << std::endl;
        return -1;
    }
    glfwSetErrorCallback(callback_error);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    GLFWwindow *window = glfwCreateWindow(640, 480, "Block++", NULL, NULL);

    if (!window)
    {
        std::cerr << "Failed to open window" << std::endl;
        return -1;
    }
    glfwMakeContextCurrent(window);

    gladLoadGL();

    // This line works well so I guess the issue is not related to OpenGL imports
    std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;

    glfwSwapInterval(1);

    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

    glClearColor(0.22f, 0.83f, 0.86f, 0.0f);
    camera.setWindowSize(640, 480);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glClearDepth(1.0f);

    //Some initialization stuff here, removing does not impact the result


    // This is the main render loop
    while (!glfwWindowShouldClose(window))
    {
        
        // The error happens here (I saw that using gdb with Visual Studio Code)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // And it happens here if I remove the glClear line
        glLoadIdentity(); 

        // The actual rendering stuff is never executed because of the error

        glFlush();
        glfwSwapBuffers(window);

        glfwWaitEvents();
        //glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
}

而且错误信息不是很有帮助和具体:

OpenGL version: 4.6 (Core Profile) Mesa 21.1.1 // OpenGL seems to be working
[1]    19991 segmentation fault (core dumped)  ./main

我在 StackOverflow 和其他网站上找到的答案并没有帮助我解决我的问题,因为他们经常提到我被告知已过时的 GLUT。

【问题讨论】:

  • glLoadIdentity() 不适用于 4.6 Core Profile 上下文。
  • @Rabbid76 我不明白你的回答究竟意味着什么:我应该使用其他东西而不是 glLoadIdentity() 还是应该使用其他版本的 OpenGL?
  • 您不能在核心配置文件上下文中使用glLoadIdentity,因为glLoadIdentity 已过时并且只能与兼容性配置文件一起使用。见OpenGL ContextLegacy OpenGL
  • 另外,您应该生成一个 GL 加载器,它与您使用的实际 GL 版本和配置文件相匹配。正确的核心配置文件加载器不会暴露 glLoadIdentity
  • 感谢您的回答,我将对此进行更多研究

标签: c++ opengl glfw glad


【解决方案1】:

我找到了两种“解决”问题的方法:

  1. 使用兼容性配置文件(不推荐,但非常简单):
// Replace this
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// by this
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

这并不是真正的修复,但它允许程序运行已弃用和删除的指令。

  1. 正确加载 GLAD 并使用现代 OpenGL(这是这样做的好方法)
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

这会正确加载 GLAD,但必须重构其余代码以适应现代 OpenGL 要求(着色器等)。
我在this 网站上学到了很多关于着色器和顶点数组的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2022-01-14
    • 2011-01-08
    相关资源
    最近更新 更多