类过程中的OpenGL空白屏幕

时间:2018-10-25 11:15:01

标签: c++ opengl

我试图编写一个名为CreateShape的过程,该过程具有一个参数shapeID作为输入,然后将VAO ID(顶点数组对象ID)推送到向量中,以便我可以随时使用VAO ID绑定和绘制指定的形状。但是,当我尝试不使用CreateShape创建和绘制形状时,就不会绘制任何内容。

但是,如果我在核心引擎类中编写相同的代码,它将起作用。

注意:GLCall()仅用于调试目的。

使用渲染类过程的核心引擎主要过程: https://gyazo.com/9f9dfce8bfd8fbb68e06d7e2a3c67066

void Engine::Start()
    {
    graphics::Renderer renderer;
    renderer.CreateShape(graphics::Triangle::id);   
    renderer.SetShader("source/graphics/renderer/resource/Default.shader");


    while(!window.IsWindowClosed())
    {
        renderer.DrawTriangle();
        window.Update();
    }
}

Core Engine Main Procedure创建和绘制形状本身:https://gyazo.com/a7b701d16fae76475456192b31190812

    void Engine::Start()
    {
    graphics::Renderer renderer;

    VertexBuffer VBO(Triangle::vertices, sizeof(Triangle::vertices));
    VBO.PushLayout(3, GL_FLOAT);

    VertexArray VAO;
    VAO.Set(VBO);
    VAO.Bind();

    renderer.SetShader("source/graphics/renderer/resources/Default.shader");

    while(!window.IsWindowClosed())
    {
        GLCall(glDrawArrays(GL_TRIANGLES, 0, 3));
        window.Update();
    }
}

创建形状过程:

void Renderer::CreateShape(unsigned int shapeID){ //During this test shapeID is set to be a Triangle

switch (shapeID)
{
case graphics::Triangle::id:
{
    VertexBuffer VBO(Triangle::vertices, sizeof(Triangle::vertices));
    VBO.PushLayout(3, GL_FLOAT);

    VertexArray VAO;
    VAO.Set(VBO);
    VAO.Bind();

    renderObjects.push_back(VAO.GetId());
    break;
}
// More cases included here...
}

绘制三角形的步骤:

void graphics::Renderer::DrawTriangle()
{
    GLCall(glBindVertexArray(renderObjects.front()));
    GLCall(glDrawArrays(GL_TRIANGLES, 0, 3));
}

1 个答案:

答案 0 :(得分:0)

Rabbid76指出的问题是,一旦该过程超出范围,就会调用顶点缓冲区和顶点缓冲区数组的析构函数,这将删除缓冲区,从而导致屏幕空白,因为顶点缓冲区和顶点的ID数组现在无效。