在调用glVertexPointer()
(以及其他相关函数)时,使用堆栈上的顶点数组是否安全?当OpenGL实际上从传入的结构中复制数据时,我不清楚。
如果不安全,那么您如何知道何时可以摧毁/重复使用传递给glVertexPointer()
的结构?
(不使用VBO)
答案 0 :(得分:6)
在顶点数组的情况下,在执行glDrawElements()
和朋友期间,指针将被取消引用,假设GL_VERTEX_ARRAY
已被glEnableClientState()
编辑。
只要glDrawElements()
返回,OpenGL就会拥有所需的所有数据,因此您可以free()
免费使用。
对于VBO,你永远不会传入真正的指针,所以它并不重要:)
所以这样的事情应该有效:
void draw()
{
vector< float > verts;
verts.push_back( 0 );
verts.push_back( 0 );
verts.push_back( 0 );
verts.push_back( 10 );
verts.push_back( 0 );
verts.push_back( 0 );
verts.push_back( 10 );
verts.push_back( 10 );
verts.push_back( 0 );
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &verts[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
}
答案 1 :(得分:1)
glVertexPointer从不复制数据,只是设置一个指针,当你调用glDrawArrays和glDrawElements时读取并传输到GPU,在这些函数返回后,数据可以安全释放。