Ответ 1
Все функции OpenGL, за исключением отмеченных ниже, будут закончены любым указателем, который вы дадите ему при возврате этой функции. Таким образом, glReadPixels
завершит все считывание пикселей и преобразование формата по его возврату. Вот почему асинхронная передача пикселей настолько важна для операций чтения. Это позволяет OpenGL не делать этого, чтобы не синхронизироваться с графическим процессором.
Единственным исключением из этого правила является каждая функция, которая заканчивается словом "Указатель". Такие вещи, как glVertexAttribPointer
, glTexCoordPointer
и тому подобное. Когда вы используете клиентскую память с этими функциями (больше не легальны в основном профиле OpenGL 3.2+), эти функции сохраняют указатель на эту память. Поэтому вы должны убедиться, что этот указатель действителен до тех пор, пока вы намереваетесь визуализировать эти атрибуты вершин.
После каждого вызова рендеринга с использованием клиентской памяти OpenGL требует, чтобы реализация завершила чтение из клиентской памяти к моменту возвращения функции рендеринга. Поэтому вы можете вызвать glDrawArrays
, а затем удалить указанные указатели. И пока вы не делаете другой призыв к призыву, пока вы не измените эти указатели, вы в порядке. Это означает, что OpenGL должен был скопировать все соответствующие данные вершин к моменту возвращения вызова рендеринга (одна из причин, по которой использование буферизующих объектов происходит быстрее).