Цель map и unmap - сказать: «Мне нужен указатель на это». и «Я закончил, используя указатель на это». Это то, что делают функции.
Когда вы удаляете карту из буфера, драйвер теперь может свободно:
- Скопируйте записанные вами данные (если вы что-то написали) в объект буфера, если сопоставленный указатель не является прямым указателем на этот буфер.
- Перемещение объекта буфера в памяти графического процессора, если отображенный указатель является указателем на этот объект.
Помните: отображение указателя не имеет для возврата фактического указателя на этот буфер. Он просто возвращает указатель на то, что при чтении данные будут храниться в этом буфере, а при записи записанные байты будут переданы в буфер после отмены отображения.
Кроме того, единственная причина, по которой вы предлагаете, заключается в том, что вы хотите прочитать данные в буфере. Ну, так как вы только что отобразили буфер (предположительно для записи, иначе вы бы не отобразили его), вы знаете, что в нем. Если вам нужен доступ к нему ЦП, вы должны были просто хранить данные локально; таким образом вы получите гораздо более надежный доступ к нему.
И если вы делаете другую передачу пикселей, считывание с этого указателя означает, что OpenGL должен будет выполнить синхронизацию, потому что весь смысл PBO - асинхронная передача. То есть, когда вы выполняете glReadPixels
или что-то еще, OpenGL может ожидать фактического завершения этой операции, пока вы не отобразите буфер или не используете glGetBufferSubData
.
Но если буфер отображается для чтения, то OpenGL не знает, когда вы собираетесь читать с него (поскольку он не может определить, когда вы читаете по указателю). Таким образом, OpenGL не может гарантировать хранение в нем. Короче говоря: неопределенное поведение. В этот момент вы можете получить что угодно .
То, о чем вы говорите, не имеет смысла.