Как читать 3D текстуру из памяти GPU с помощью объектов Pixel Buffer - PullRequest
0 голосов
/ 05 декабря 2011

Я записываю данные в 3D-текстуру из фрагментного шейдера, и мне нужно асинхронно считывать эти данные в системную память.Кажется, что единственным средством асинхронного запуска операции упаковки в буферный объект является вызов glReadPixels() с указателем NULL.Но эта функция требует прохождения прямоугольника, определяющего область для чтения.Теперь я не знаю, игнорируются ли эти параметры при использовании PBO, но я предполагаю, что нет.В этом случае я понятия не имею, что передать этой функции, чтобы получить всю трехмерную текстуру.Даже если мне придется читать отдельные фрагменты (что было бы глупо для IMO), я все еще не представляю, как сообщить OpenGL, какой фрагмент считывать.Я что-то упустил?

Кстати, я мог бы использовать отдельные 2D текстуры для каждого среза, но это могло бы испортить (3D-) миппинг, если я не ошибаюсь.Я хотел использовать трехмерные карты, чтобы эффективно находить области интереса в результирующей трехмерной текстуре.

PS Извините за неоптимальные теги, очевидно, никто никогда не спрашивал о трехмерных текстурах раньше, и, поскольку язапрещено создавать новые теги ...

1 Ответ

2 голосов
/ 05 декабря 2011

Кто сказал, что glReadPixels - единственный способ прочитать данные изображения? Может быть, в OpenGL ES это так, но если вы используете ES, вам следует так сказать. Остальная часть этого ответа будет предполагать, что вы говорите о настольном GL.

Если у вас есть текстура, и вы хотите прочитать ее содержимое, вы должны использовать glGetTexImage. Переключатель, который управляет чтением в буферный объект или нет, является тем же переключателем, который управляет им для glReadPixels: связан ли буфер с GL_PIXEL_PACK_BUFFER.

Обратите внимание, что glGetTexImage будет извлекать всю текстуру (для данного уровня mipmap).

...