Когда glVertexPointer () копирует данные? - PullRequest
8 голосов
/ 08 августа 2011

Безопасно ли использовать массив вершин, который находится в стеке, при вызове glVertexPointer() (и других связанных функций)?Мне неясно, когда OpenGL фактически копирует данные из переданной структуры.

Если это небезопасно, то как узнать, когда безопасно уничтожить / повторно использовать структуру, которую вы передали glVertexPointer()?

(без использования VBO)

Ответы [ 2 ]

6 голосов
/ 08 августа 2011

В случае массива вершин указатель будет разыменован во время выполнения glDrawElements() и друзей, предполагая, что GL_VERTEX_ARRAY было glEnableClientState() ed.

Как только 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 голос
/ 08 августа 2011

glVertexPointer никогда не копирует данные, он просто устанавливает указатель, который читается и передается в графический процессор при вызове glDrawArrays и glDrawElements, после того как эти функции возвращены, данные можно безопасно освобождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...