Я пытаюсь заменить 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
, я получаю неполный буфер кадра.