OpenGL应用程序控制台未关闭[关闭]

Posted

技术标签:

【中文标题】OpenGL应用程序控制台未关闭[关闭]【英文标题】:OpenGL Application console not closing [closed] 【发布时间】:2021-03-09 18:21:42 【问题描述】:

我正在使用 Visual Studio 社区,并且正在尝试创建 OpenGL 应用程序。 我正在使用 GLFW 打开这样的窗口:

int main() 
    //Init stuff
    int width = 1920;


    int height = 1080;
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow* window = glfwCreateWindow(width, height, "LearnOpenGL", NULL, NULL);
    if (window == NULL) 
        std::cout << "Failed to create Window du schmok" << std::endl;

        glfwTerminate();
        return -1;
    
    glfwMakeContextCurrent(window);
    if (glewInit() != GLEW_OK) 
        std::cout << "Glew was not initialized du schmok" << std::endl;
    
    glViewport(0, 0, width, height);

    VertexBuffer vbo(vertices, sizeof(vertices));
    IndexBuffer ibo(indices, 6);

    while (!glfwWindowShouldClose(window))
    
        glClearColor(0.0f, 0.3f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    

    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;

我已将索引缓冲区和顶点缓冲区抽象为如下所示的类: 顶点缓冲区:

VertexBuffer::VertexBuffer(float data[], unsigned int size)

    GL_CALL(glGenBuffers(1, &m_ID));
    GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_ID));
    GL_CALL(glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW));


VertexBuffer::~VertexBuffer()

    GL_CALL(glDeleteBuffers(1, &m_ID));


void VertexBuffer::Bind()

    GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_ID));


void VertexBuffer::Unbind()

    GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));

和索引缓冲区:

IndexBuffer::IndexBuffer(unsigned int indices[], unsigned int count)

    m_Count = count;
    GL_CALL(glGenBuffers(1, &m_ID));
    GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ID));
    GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_Count * sizeof(unsigned int), indices, GL_STATIC_DRAW));


IndexBuffer::~IndexBuffer()

    GL_CALL(glDeleteBuffers(1, &m_ID));


void IndexBuffer::Bind()

    GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ID));


void IndexBuffer::Unbind()

    GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));

问题是关闭窗口后控制台保持打开状态并闪烁等待。我只能使用 Visual Studio 或手动关闭控制台来终止程序。 我已经尝试过代码,这是因为我为缓冲区创建对象的两行: 没有这两行,它就可以工作。有谁知道这是为什么?

【问题讨论】:

我知道那个选项。但是我没有收到“按任意键关闭”的文字。它只是闪烁,只能使用 Visual Studio 调试器或关闭按钮关闭。但是如果我按下关闭按钮,我也会得到一个返回码!= 0。 两条线都失败了。我都评论了。然后只有一个,然后是另一个。如果这两行都留在程序中,则会给出我描述的结果。 问题是,你从不在代码中使用 vbo 或 ibo,所以我现在认为它必须在析构函数中。这个删除缓冲区调用正确吗?顶点和索引缓冲区的 m_id 是否可能相同? 一个问题肯定是,在 OpenGL 上下文被删除之后调用析构函数。那时调用任何 OpenGL 命令都会有问题。不确定这是否会导致程序保持打开状态。 @Nicky:GL_CALL 的定义是什么?确定在没有返回错误之前它不会循环吗? 【参考方案1】:

正如 cmets 中提到的,问题来自缓冲区的破坏:在 OpenGL 上下文被破坏后,程序尝试调用 glDestroyX(在缓冲区析构函数中),这会引发 GL_Call 尝试使用处理的错误GL 上下文,因此它本身也会引发错误等等。

要解决这个问题,请在范围内声明和使用缓冲区,并在范围结束后销毁 GL 上下文,以便在销毁 GL 上下文之前销毁 GL 对象

【讨论】:

这实际上解决了它,虽然看起来很丑但它有效。

以上是关于OpenGL应用程序控制台未关闭[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

旧视图控制器未关闭

如何与opengl并行运行程序[关闭]

OpenGL 4 标头 [关闭]

Chrome控制台-未捕获(承诺)TypeError:this.engines不可迭代[关闭]

有必要创建情侣程序OpenGL吗? [关闭]

使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序