我试图编写一个名为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));
}
答案 0 :(得分:0)
Rabbid76指出的问题是,一旦该过程超出范围,就会调用顶点缓冲区和顶点缓冲区数组的析构函数,这将删除缓冲区,从而导致屏幕空白,因为顶点缓冲区和顶点的ID数组现在无效。