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

在OpenGL执行之间强制GPU内存刷新,opengl,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),

如果我这样做:

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中存储的顶点

为了检查这一点,我只注释行
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0)。程序崩溃了。然后我取消了它的注释,得到了预期的黑屏

那么,在案例1中初始化的内存是否真的在案例2中使用(即使我没有用任何顶点初始化缓冲区)?那么,我如何避免这些副作用,以便更快地发现未经授权的记忆呢

编辑1:使用GL\u STREAM\u 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之间的区别。只是说随机未初始化内存也会有帮助(当然,如果这是这里的实际问题):


使用调试器工具可能会对您有所帮助(可能是gDEBugger)。图形卡上的未初始化内存与主RAM上的内存几乎相同。读取随机内存时,您可能会得到相同的工件。

这里的问题是,我觉得内存的“随机性”较低而且比普通RAM更持久。这实际上取决于驱动程序的实现。在图形卡上分配内存时,有很多优化正在进行,而不是在主RAM上进行。如果您阅读我的编辑,您可以看到我所说的“更持久”的意思好的。看来使用调试器是唯一的选择。谢谢。滥用
GL\u STATIC\u DRAW
usage提示的方法。如果您要在调用
glBufferData(…)后立即调用
glBufferSubData(…)
使用该标志调用时,您应该将NULL传递给第一个调用。否则,请使用
GL\u STREAM\u DRAW
。它们最终只是提示,但您应该按照预期的方式使用。更大的问题是,为什么要使用未提供任何数据的顶点进行绘制?您可以完全控制绘制的索引,您可以很容易地将它们限制到VBO中实际存在的顶点。@AndonM.Coleman:主要问题是,在编码时,您会犯这样的错误。使用随机内存有助于跟踪和查找这些错误。我只是尝试重新创建一个错误,看看将来如何帮助跟踪这样的错误。好吧,不要指望OpenGL提供任何帮助。我使用未初始化的元素缓冲区(或者元素超出范围的缓冲区)的行为例如,在NV硬件上可能是一堆垃圾,而在AMD上可能根本没有绘制原语。这就是OpenGL的问题,每个供应商都从头开始实现整个事情——OpenGL规范没有告诉任何供应商,他们应该如何处理未初始化的内存,甚至是如何访问缓冲区对象中的内存超出范围(不过WebGL会这样做)。好的,谢谢。所以在调试模式下编码时,是否有好的做法将所有内存初始化为0(至少)?
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;
}
-858993460
-858993460
1234
5678