Opengl 只绑定创建它们的函数的缓冲区

Opengl only binds buffers from function that created them

我正在尝试编写一个非常准系统的游戏引擎来了解它们在内部是如何工作的,我已经到了我有一个“客户端”应用程序向引擎发送工作的地步。到目前为止这是有效的,但我遇到的问题是我的测试三角形仅在我从“主”函数(或创建缓冲区的任何地方)绑定缓冲区时呈现

即使缓冲区被抽象并且具有具有相同成员值的相同函数(使用 clion 的调试器验证)但它们 仍然 必须绑定在创建它们的函数

例如我有这段代码来创建缓冲区并设置它们的数据

...

Venlette::Graphics::Buffer vertexBuffer;
Venlette::Graphics::Buffer indexBuffer;

vertexBuffer.setTarget(GL_ARRAY_BUFFER);
indexBuffer.setTarget(GL_ELEMENT_ARRAY_BUFFER);

vertexBuffer.setData(vertices, sizeof(vertices));
indexBuffer.setData(indices, sizeof(indices));


glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, nullptr);

... 

其中顶点是 6 个浮点数的 c 数组,索引是 3 个无符号整数

然后将缓冲区传递到“上下文”以存储以便稍后使用以下代码进行渲染

...

context.addBuffer(vertexBuffer);
context.addBuffer(indexBuffer);
context.setNumVertices(3);
context.setNumIndices(3);

context.
...

调用:addBuffer

Task& task = m_tasks.back();
task.buffers.push_back(std::move(buffer));

这又一次有效。缓冲区存储正确,当代码到达这里时缓冲区仍然存在并且没有错误。

然后它到达缓冲区所在的绘图部分:绑定,绘制,然后解除绑定,如图所示

...

for (auto& buffer : task.buffers) {
    buffer.upload();
    buffer.bind();
}

glDrawElements(GL_TRIANGLES, task.numIndices, GL_UNSIGNED_INT, nullptr);

for (auto& buffer : task.buffers) {
    buffer.unbind();
}

...

绑定和解除绑定就是这些函数

void Buffer::bind() const noexcept {
    if (m_id == -1) return;
    glBindBuffer(m_target, m_id);
    spdlog::info("bind() -{}-{}-", m_id, m_target);
}

void Buffer::unbind() const noexcept {
    if (m_id == -1) return;
    glBindBuffer(m_target, 0);
    spdlog::info("unbind() -{}-{}-", m_id, m_target);
}

但这是没有任何作用的地方。如果我从绘制缓冲区的“doWork”函数调用 buffer.bind(),则不会呈现任何内容,但是如果我从主函数调用 buffer.bind(),我会在中间得到一个白色三角形屏幕

即使我绑定然后解除绑定来自主缓冲区的缓冲区,这仍然是问题所在,但它仍然没有绘制。仅当buffer是bound并且remain从main函数绑定时,即draws

完整代码的 pastebin(没有 headers)

pastebin

有谁知道为什么会发生这种情况,即使您不知道如何修复它。它与缓冲区寿命有关,还是与将缓冲区移动到向量中有关? 只是 buffer.bind() 不工作,上传数据从上下文工作,只是不绑定它

在调用 glVertexAttribPointer.

之前,您似乎没有将顶点缓冲区绑定到 GL_ARRAY_BUFFER 缓冲区绑定点

glVertexAttribPointer 使用绑定到 GL_ARRAY_BUFFER 的缓冲区来了解哪个缓冲区是该通用顶点属性的顶点属性源。

所以,你应该在调用之前绑定vertexBuffer glVertexAttribPointer