OpenGL通过重新指定更新VBO数据

问题描述 投票:0回答:1

我正在尝试更改 VBO 的内容,但它是用于流绘制,因此我试图理解并遵循here(和here)解释的概念,但是当我尝试一下。

这就是我正在尝试做的:

void Model::Draw()
{
    //Changing only the vertexesVBO
    _vertexes[0] += 0.0001f;
    glBindBuffer(GL_ARRAY_BUFFER, _vboVertexes._bufferID);

    //This works
    //glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float), &_vertexes[0]);

    //But this doesn't
    glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, _vertexCount * sizeof(float), _vertexes);

    //Call vertexVBO, uvVBO, indexIBO, disable them
}

据说,我正在创建一个大小为 _vertexCount * sizeof(float) 的新 BufferData 和未初始化的数据,并将相同的 _vertexes 数据上传到其中,以便在下一次绘制调用中使用。 但这会引发访问冲突读取的错误。

如何让它发挥作用? 如果我理解正确的话,我就不需要为动画实现双缓冲区 VBO,对吧?

c++ opengl
1个回答
2
投票

据说,我正在创建一个大小为 _vertexCount * sizeof(float) 的新 BufferData 和未初始化的数据,并将相同的 _vertexes 数据上传到其中以在下一次绘制调用中使用。

不。您只需创建一个大小为 0 的新缓冲区存储。并且使用

glBufferSubData()
进行的更新将会失败,因为它访问的缓冲区越界。

© www.soinside.com 2019 - 2024. All rights reserved.