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_TRUEGLFW_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程序不断崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 应用程序崩溃

OpenGL:随机调用 OpenGL 函数时崩溃

内存警告后在 iOS 上运行 OpenGL 崩溃

带有 GLFW 和 GLEW 的 OpenGL 应用程序崩溃

SDL OpenGL 应用程序在发布模式下崩溃 [重复]

为啥在使用 OpenGL 核心配置文件时会崩溃?