glViewport 的分段错误(使用 GLFW 和 GLAD 的 openGL C++ 编程)

Segmentation Fault with glViewport (openGL C++ programming with GLFW and GLAD)

1)问题总结:

我完全按照 LearnOpenGL.com 上的教程进行操作。

每当调用 glViewport 时,我的程序都会崩溃(出现分段错误)。根据下面显示的代码(以及教程中的代码)调用 glViewport 时如何让它不崩溃。

2)我尝试过的:

除了谷歌搜索这个确切的东西并与多个教程相关联之外,我还尝试摆弄代码。请参阅下面的代码。它在 main() 中调用 glViewport() 的地方,我试图将其注释掉并重新编译。该程序不再崩溃,但如果我调整 window 的大小,它会因分段错误而崩溃。如果我注释掉 glViewport 调用和 glfwSetFramebufferSizeCallback 调用,那么我可以调整 window 的大小而不会崩溃。

3) 以下是编译命令行、GLXINFO 和代码。

编译:

g++ program.cpp  -ldl -lGL -lglfw  -o program

我根据 glxinfo 的说明和信息(此处摘录)下载了 GLAD

OpenGL 核心配置文件版本字符串:4.6.0 NVIDIA 460.80 OpenGL 核心配置文件着色语言版本字符串:4.60 NVIDIA OpenGL 核心配置文件上下文标志:(none) OpenGL 核心配置文件配置文件掩码:核心配置文件

OpenGL 版本字符串:4.6.0 NVIDIA 460.80 OpenGL 着色语言版本字符串:4.60 NVIDIA OpenGL 上下文标志:(none) OpenGL 配置文件掩码:(none)

OpenGL ES 配置文件版本字符串:OpenGL ES 3.2 NVIDIA 460.80 OpenGL ES 配置文件着色语言版本字符串:OpenGL ES GLSL ES 3.20

代码

#include <iostream>
#include "../glad/glad.c"
//#include "glad.c"
#include </usr/include/GLFW/glfw3.h>

// FUNCTION PROTOTYPES 

// register callback function to resize viewport if user resizes window
void framebuffer_size_callback(GLFWwindow* window, int width, int height); 

using namespace std;
int main()
{
    //initializes GLFW
    if (!glfwInit())
        return -1; 
    
    // initializes what version to use
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    
    // create window object
    GLFWwindow* window; 
    window = glfwCreateWindow(1024, 768, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    
    // register viewport resize callback function to window (auto resize viewport)
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    
    /* THIS IS CRASHING WITH SEG FAULT ** */
    // viewport
    glViewport(0, 0, 800, 600);
    
    
    //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 
    
    // window or application loop
    while(!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();    
    }
    
    
    // properly clean up and exit
    glfwTerminate(); 
    return 0;
}

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    /* THIS IS CRASHING WITH SEG FAULT ** */
    glViewport(0, 0, width, height); 
}

在其他gl函数继续出现这个问题并进一步研究后,可以通过在glfwMakeContextCurrent(window)之后添加以下代码来解决问题。这已经解决了问题中列出的 glViewport 调用的所有分段错误。

gladLoadGL();