OpenGL程序不断崩溃?
Posted
技术标签:
【中文标题】OpenGL程序不断崩溃?【英文标题】:OpenGL program keeps crashing? 【发布时间】:2019-10-31 01:36:55 【问题描述】:此代码返回 3 个错误(字面意思是所有错误)
GLEW init failed; GLFW init failed; Window creation failed
:
#include "GL/glew.h"
#include "GLFW/glfw3.h"
#include <iostream>
//Window dimensions
const GLint SCREEN_WIDTH = 800, SCREEN_HEIGHT = 600;
int main()
//Initialize GLFW
if (glfwInit() != GLEW_OK)
std::cout << "GLFW init failed\n";
glfwTerminate();
//Setup GLFW window properties
//OpenGL version
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //Large version
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //Small version
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Detects any old OpenGL code, this will throw an error
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Allows forward compatibility (between differnt OS)
//Creating window
GLFWwindow* window;
window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "OpenGL Test Window", NULL, NULL);
if (window == NULL)
std::cout << "GLFW window creation failed!\n";
glfwTerminate();
//Get buffer size information
int BUFFER_WIDTH, BUFFER_HEIGHT;
glfwGetFramebufferSize(window, &BUFFER_WIDTH, &BUFFER_HEIGHT);
//Set context for GLEW to use (can change between which window)
glfwMakeContextCurrent(window);
//Allow modern extension features
glewExperimental = GL_TRUE;
if (glfwInit() != GLEW_OK)
std::cout << "Glew init failed!\n";
glfwDestroyWindow(window);
glfwTerminate();
//Setup viewport size
glViewport(0, 0, BUFFER_WIDTH, BUFFER_HEIGHT);
//Main game loop
while (!glfwWindowShouldClose(window))
//Get + Handle user input events
glfwPollEvents();
//Clear window
glClearColor(1.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
【问题讨论】:
唯一相关的错误是glfwInit();
调用,因为一旦出现该错误,您就无法退出应用程序。
@PaulMcKenzie 对不起? “......一旦出现该错误,无法退出您的应用程序”?你是什么意思?我为这两个事件都做了glfwTerminate();
。
不,没有返回 C++ main
函数。您的代码调用glfwTerminate()
,但这与main
返回无关——它只是一个函数调用。要终止应用程序,您可以从main
中调用return
,或者调用exit()
。这就是您看到其他错误消息的原因——您未能解决第一个错误并且您的程序继续运行。另外,从逻辑上考虑一下——如果我想在我的应用程序中间结束 gl 引擎,但让我的应用程序继续运行怎么办? glfwTerminate() 会结束我的整个应用程序吗?当然不是。
【参考方案1】:
试试这个,你需要初始化Glew。
GLenum GlewInitResult;
GlewInitResult = glewInit();
if ( GLEW_OK != GlewInitResult)
glfwTerminate();
return -1;
【讨论】:
【参考方案2】:这是错误的:
if (glfwInit() != GLEW_OK) std::cout << "GLFW init failed\n"; glfwTerminate();
GLEW_OK
定义为 0(参见 https://github.com/nigels-com/glew/blob/master/auto/src/glew_tail.h)
因此评估如下:
if (glfwInit() != 0)
只有在 GLFW 正确初始化时才为真。
所以把那部分改成:
if (glfwInit() == 0)
std::cout << "GLFW init failed\n";
glfwTerminate();
【讨论】:
我认为 OP 的意思是glfwInit() != GLFW_TRUE
,只是使用了错误的常量。【参考方案3】:
有 2 个问题。
glfwInit
如果成功则返回GLFW_TRUE
(GLFW_TRUE
为 1)。所以它必须是:
if (glfwInit() != GLFW_TRUE)
std::cout << "GLFW init failed\n";
(注意,如果GLFW初始化失败,则无需调用glfwTerminate()
)
如果你想安装GLEW,那么你必须调用glewInit
而不是glfwInit
。如果成功,glewInit
返回GLEW_OK
(参见Initializing GLEW)。 GLEW_OK
是 0。所以它必须是:
if (glewInit() != GLEW_OK)
std::cout << "Glew init failed!\n";
glfwDestroyWindow(window);
glfwTerminate();
【讨论】:
以上是关于OpenGL程序不断崩溃?的主要内容,如果未能解决你的问题,请参考以下文章