如果我这样做:
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
答案 0 :(得分:2)
使用调试工具可能对您有帮助(可能是gDEBugger)。未初始化的内存在显卡上与在主RAM上几乎相同。你可以得到同样的神器读取随机记忆。