OpenGL初学者程序不断崩溃?

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

我正在启动OpenGL / GLFW,代码看起来还不错,我在网上看起来很不错,但是现在太晚了,所以我可能会丢失一些东西。这段代码主要来自Udemy课程,我以前从未开始过3D图形,只有SFML的2D就是这样。下面的代码在这里->

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

此代码返回3个错误(实际上是所有错误)GLEW init failed; GLFW init failed; Window creation failed

[请帮助我找出问题所在,谢谢。

c++ opengl 3d core-graphics
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初始化失败,则无需调用GLFW

glfwTerminate()

如果要安装if (glfwInit() != GLFW_TRUE) { std::cout << "GLFW init failed\n"; } ,则必须调用GLEW而不是glewInit。如果成功,则glfwInit返回glewInit(请参阅GLEW_OK)。 Initializing GLEW为0。因此必须为:

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