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应用程序控制台未关闭[关闭]的主要内容,如果未能解决你的问题,请参考以下文章