Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glVertexPointer()何时复制数据?_Opengl - Fatal编程技术网

Opengl glVertexPointer()何时复制数据?

Opengl glVertexPointer()何时复制数据?,opengl,Opengl,调用glVertexPointer()(以及其他相关函数)时,使用堆栈上的顶点数组是否安全?我不清楚OpenGL何时从传入的结构中复制数据 如果不安全,那么如何知道何时可以安全地销毁/重用传递给glvertexpinter()的结构 (不使用VBOs)在顶点数组的情况下,指针将在执行glDraweElements()和friends期间解除引用,假设GL\u vertex\u数组已被glEnableClientState()ed 只要glpaurements()返回,OpenGL将拥有它所需的所

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

如果不安全,那么如何知道何时可以安全地销毁/重用传递给
glvertexpinter()
的结构


(不使用VBOs)

在顶点数组的情况下,指针将在执行
glDraweElements()
和friends期间解除引用,假设
GL\u vertex\u数组
已被
glEnableClientState()
ed

只要
glpaurements()
返回,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);
}
void draw()
{
向量顶点;
垂直推回(0);
垂直推回(0);
垂直推回(0);
垂直推回(10);
垂直推回(0);
垂直推回(0);
垂直推回(10);
垂直推回(10);
垂直推回(0);
glEnableClientState(GL_顶点_数组);
glVertexPointer(3,GLU浮点,0,&verts[0]);
gldrawArray(GL_三角形,0,3);
glDisableClientState(GL_顶点_数组);
}

glVertexPointer从不复制数据,它只设置一个指针,当您调用glDrawArrays和GLDRAWEREMENTS时,该指针将被读取并传输到GPU,在这些函数返回后,数据可以安全释放。

要获得正确答案,如果您使用VBOs,则应添加指针。错误!可以在glBufferData之后释放数据,而不是在发出draw命令之后!不要误导别人。@lukasz1985问题提到他没有使用VBOs,所以你的评论不适用。