在OpenGL执行之间强制GPU内存刷新

时间:2013-12-03 16:00:02

标签: opengl

如果我这样做:

glBindBuffer(GL_ARRAY_BUFFER, m_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions1)+sizeof(vertexPositions2), vertexPositions1, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertexPositions1), sizeof(vertexPositions2), vertexPositions2); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

我显示正确的形状。现在,如果我用以下代码替换这些行:

glBindBuffer(GL_ARRAY_BUFFER, m_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions1)+sizeof(vertexPositions2), 0, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

我仍然得到两个正确的形状(没有任何东西被添加到缓冲区中)。我想这是因为在两种情况下为缓冲区分配的内存是相同的。因此,在案例2中,它实际上使用了在案例1中存储的顶点。

要检查一下,我只是评论一下glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);行。程序崩溃了。然后我取消注释它,我按预期得到一个黑屏。

那么,实际上在案例2中实际使用的内存是否真的被初始化(即使我没有用任何顶点初始化我的缓冲区)?那么,我怎样才能避免这种副作用更快地检测出未经过处理的记忆?

编辑1:使用GL_STREAM_DRAW产生相同的行为

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions1)+sizeof(vertexPositions2), vertexPositions1, GL_STREAM_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertexPositions1), sizeof(vertexPositions2), vertexPositions2); 

编辑2:“类似”在CPU上使用未初始化的内存(我不是在问为什么或者CPU和GPU之间存在差异。只是声明随机未初始化的内存也会有所帮助(如果这是当然这里的实际问题):

int a[2];
for (unsigned int i = 0; i < 2; ++i)
{
    std::cout << a[i] << std::endl;
}

a[0] = 1234; a[1] = 5678;
for (unsigned int i = 0; i < 2; ++i)
{
    std::cout << a[i] << std::endl;
}

连续执行2次将产生:

-858993460
-858993460
1234
5678

1 个答案:

答案 0 :(得分:2)

使用调试工具可能对您有帮助(可能是gDEBugger)。未初始化的内存在显卡上与在主RAM上几乎相同。你可以得到同样的神器读取随机记忆。