OES_depth_texture и glReadPixels

Расширение open gles 2.0, OES_depth_texture, позволяет писать информация о глубине в буфер кадра с прикрепленной текстурой.

Однако спецификация не описывает использование glReadPixels с таким расширением. Насколько я могу судить, glReadPixels не будет работать с таким буфером кадров (я пробовал и получил ошибку недопустимой операции).

Я прав в этом предположении? Кто-нибудь знает другую ссылку на эту проблему? Или есть альтернатива чтению из прикрепленной текстуры использованию glReadPixels?


person user51764    schedule 23.01.2021    source источник


Ответы (1)


См. OES_depth_texture:

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

Прямого пути нет. Вы можете сделать это только косвенно. Если вы хотите прочитать глубокую текстуру, вам нужно сделать следующие шаги:

  1. Создайте буфер кадра того же размера, что и глубокая текстура.

  2. Используйте шейдер, чтобы прочитать глубокую текстуру и записать ее во вложение цвета буфера кадра.

  3. Используйте glReadPixels для чтения цветового буфера.


Для оборудования Nvidia может существовать альтернатива, поддерживающая NV_read_depth. расширение:

Unextended OpenGL-ES 2.0 поддерживает только использование ReadPixels для чтения из цветового буфера по умолчанию для привязанного в данный момент кадрового буфера. Однако для отладки полезно иметь возможность чтения из буферов глубины и трафаретов. Это расширение повторно вводит эти функции в OpenGL-ES 2.0.

К сожалению, я не нашел соответствующего расширения OES.


Невозможно прочитать буфер глубины напрямую. См. Спецификация OpenGL ES 3.2 — 16.1.2 ReadPixels

[...] формат, выбранный реализацией из числа определенных в таблице 8.2, за исключением форматов DEPTH_COMPONENT, DEPTH_STENCIL и STENCIL_INDEX

person Rabbid76    schedule 23.01.2021
comment
Я неправильно понимаю спецификацию open gl 3.0 es? На странице 408 прямо сказано, что DEPTH_COMPONENT не может быть форматом для ReadPixels. Значит ли это, что ReadPixels нельзя использовать для чтения глубины? - person user51764; 23.01.2021
comment
@ user51764 Ты прав. Виноват. Я удалил это из своего ответа. Это как раз возможно в дестктоп OpenGL, но не в OpenGL ES - person Rabbid76; 23.01.2021