glVertexPointer()什么时候复制数据?

时间:2011-08-08 19:09:48

标签: opengl

在调用glVertexPointer()(以及其他相关函数)时,使用堆栈上的顶点数组是否安全?当OpenGL实际上从传入的结构中复制数据时,我不清楚。

如果不安全,那么您如何知道何时可以摧毁/重复使用传递给glVertexPointer()的结构?

(不使用VBO)

2 个答案:

答案 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,在这些函数返回后,数据可以安全释放。