Подтвердить что ты не робот

Когда OpenGL заканчивается с указателями в функциях?

OpenGL имеет ряд функций, которые непосредственно принимают указатели. Некоторые из них читают данные из этих указателей, другие записывают данные в эти указатели.

Однако функции OpenGL часто не выполняются немедленно. Обычно, когда вы рисуете что-то, для завершения рисования требуется некоторое время.

Итак, как я узнаю, когда OpenGL закончен указателем, который я ему даю?

4b9b3361

Ответ 1

Все функции OpenGL, за исключением отмеченных ниже, будут закончены любым указателем, который вы дадите ему при возврате этой функции. Таким образом, glReadPixels завершит все считывание пикселей и преобразование формата по его возврату. Вот почему асинхронная передача пикселей настолько важна для операций чтения. Это позволяет OpenGL не делать этого, чтобы не синхронизироваться с графическим процессором.

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

После каждого вызова рендеринга с использованием клиентской памяти OpenGL требует, чтобы реализация завершила чтение из клиентской памяти к моменту возвращения функции рендеринга. Поэтому вы можете вызвать glDrawArrays, а затем удалить указанные указатели. И пока вы не делаете другой призыв к призыву, пока вы не измените эти указатели, вы в порядке. Это означает, что OpenGL должен был скопировать все соответствующие данные вершин к моменту возвращения вызова рендеринга (одна из причин, по которой использование буферизующих объектов происходит быстрее).