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