【问题标题】:Segmentation Fault with glViewport (openGL C++ programming with GLFW and GLAD)使用 glViewport 的分段错误(使用 GLFW 和 GLAD 进行 openGL C++ 编程)
【发布时间】:2021-09-04 03:51:47
【问题描述】:

1) 问题总结:

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

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

2) 我尝试过的:

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

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

编译:

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

我根据 glxinfo 的说明和信息下载了 GLAD(摘录在这里)

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

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

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); 
}

【问题讨论】:

    标签: c++ opengl g++ glfw glad


    【解决方案1】:

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

    gladLoadGL(); 
    

    【讨论】:

    • 我实际上是从书中遵循的。我认为这个问题已经在最新的网站版本中得到解决(尽管命令略有不同)。我发布的命令似乎与作者在网站上所做的相同。我能够使用我在答案中发布的命令完成练习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多