【发布时间】: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 Context 和Legacy OpenGL。 -
另外,您应该生成一个 GL 加载器,它与您使用的实际 GL 版本和配置文件相匹配。正确的核心配置文件加载器不会暴露
glLoadIdentity。 -
感谢您的回答,我将对此进行更多研究