1)问题总结:
我完全按照LearnOpenGL .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 profile版本字符串: OpenGL ES 3.2 NVIDIA 460.80 OpenGL ES profile shading language版本字符串: 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);
}发布于 2021-06-20 09:42:58
在其他gl函数继续存在此问题并进行进一步研究后,可以通过将以下代码放在glfwMakeContextCurrent(窗口)之后来解决此问题。这解决了问题中列出的glViewport调用的所有分段故障。
gladLoadGL(); https://stackoverflow.com/questions/68051588
复制相似问题