Рендеринг текстуры глубины - неясности об использовании GL_OES_depth_texture

Я пытаюсь заменить gl_FragDepth функцию OpenGL, которая отсутствует в OpenGL ES 2.0.

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

Поскольку iOS> = 4.1 поддерживает GL_OES_depth_texture, я пытаюсь использовать GL_DEPTH_COMPONENT24 или GL_DEPTH_COMPONENT16 для текстуры глубины. Я использую следующие вызовы для создания текстуры:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);

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

  • Какие значения следует выводить во фрагментном шейдере? Я имею в виду, что gl_FragColor по-прежнему является значением RGBA, даже если текстура является текстурой глубины. Я не могу установить глубину во фрагментном шейдере, так как gl_FragDepth отсутствует в OpenGL ES 2.0
  • Как я могу прочитать текстуру глубины на заключительном этапе рендеринга, когда текстура глубины прикреплена как sampler2D?
  • Почему я получаю неполный буфер кадра, если я установил третий аргумент glTexImage2D равным GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT16_OES или GL_DEPTH_COMPONENT24_OES?
  • Правильно ли прикреплять текстуру к GL_DEPTH_ATTACHMENT? Если я изменяю это на GL_COLOR_ATTACHMENT0, я получаю неполный буфер кадра.

person cheesus    schedule 11.07.2013    source источник


Ответы (1)


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

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

Вы можете читать текстуру глубины с помощью встроенной функции texture2D, как и для обычных цветных текстур. Возвращаемое вами значение будет (d, d, d, 1.0).

Согласно спецификации расширения текстуры глубины , GL_DEPTH_COMPONENT16_OES и GL_DEPTH_COMPONENT24_OES не являются поддерживаются как внутренние форматы для текстур глубины. Я ожидал, что это вызовет ошибку. Вероятно, с этим связан статус неполного фреймбуфера.

Правильно прикреплять текстуру к GL_DEPTH_ATTACHMENT.

person Jan-Harald    schedule 21.07.2013