调用glBufferData后opengl释放内存会导致数据无法显示

时间:2016-07-21 14:36:22

标签: c++ opengl memory-management

我使用索引绘图绘制opengl。我发送顶点&图形卡的索引,然后尝试释放本地缓冲区。 释放顶点缓冲区 - 没问题,但如果我释放索引缓冲区,则不会显示任何内容。

简单地说,这段代码有效:

glGenBuffers(1, &m_VBO);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, m_Vertices.size()*6*sizeof(float), m_Vertices.data(),GL_STATIC_DRAW); 

m_Vertices.clear();
m_Vertices.shrink_to_fit();

glGenBuffers(1, &m_IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);   
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_TriangleIndeces.size() * sizeof(GLsizei), m_TriangleIndeces.data(), GL_STATIC_DRAW); 

//  m_TriangleIndeces.clear();
//  m_TriangleIndeces.shrink_to_fit();

但是如果我取消注释最后两行 - 没有显示任何内容。

我还尝试在首次渲染后释放缓冲区,但发生了相同的现象。

我明白,一旦opengl缓冲数据,如果是驱动程序或显卡,它的本地副本对我来说是免费滥用,所以我很困惑。

我正在使用Windows 10.设备管理员说我有“AMD radeon(TM)R7 M360”和“英特尔高清显卡520”,无论这意味着什么。

1 个答案:

答案 0 :(得分:0)

是的,OpenGL实现应该确实执行数据的副本。

这可能是一个驱动程序错误 由于您似乎有两个GPU,我假设您默认在英特尔GPU上运行该应用程序(英特尔以出现糟糕的GPU驱动程序而闻名)。您是否尝试在两个GPU上进行测试?你的GPU驱动程序是最新的吗?