OpenGL程序不断崩溃?

问题描述 投票:1回答:3

此代码返回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);
    }
}
c++ opengl 3d core-graphics glfw
3个回答
0
投票

尝试一下,您需要初始化Glew。

GLenum GlewInitResult;
GlewInitResult = glewInit();
if ( GLEW_OK != GlewInitResult) 
{
    glfwTerminate();
    return -1;
}

0
投票

这是错误的:

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

0
投票

有2个问题。

glfwInit如果成功则返回glfwInitGLFW_TRUE为1)。所以它必须是:

GLFW_TRUE

(注意,如果if (glfwInit() != GLFW_TRUE) { std::cout << "GLFW init failed\n"; } 初始化失败,则无需调用GLFW

如果要安装glfwTerminate(),则必须调用GLEW,而不是glewInit。如果成功,则glfwInit返回glewInit(请参阅GLEW_OK)。 Initializing GLEW为0。因此必须为:

GLEW_OK
© www.soinside.com 2019 - 2024. All rights reserved.