OpenGL ES 2.x: есть ли способ повторно использовать буфер глубины для рендеринга вне экрана и на экране? - PullRequest
4 голосов
/ 01 апреля 2012

Я делаю 2-проходный рендеринг, где на первом проходе я рендеринг на текстуру, а на втором проходе я рендеринг на экран.

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

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

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

Итак ... есть ли способ сделать одно из следующего?

  • создать мой собственный кадровый буфер, который использует буфер глубины экрана(но по-прежнему пишет цвета в текстуру)
  • прикрепить свой собственный рендер-буфер к вложению глубины фрейм-буфера по умолчанию

Единственный обходной путь, который я могу придумать (и я еще не пробовал это, поэтому я понятия не имею, какое влияние это окажет на производительность), чтобы второй проход также рендерился в текстуру, а затем был бы третий проход, который просто «перетягивал» текстуру на экран.

1 Ответ

1 голос
/ 02 апреля 2012

Из чтения Версия спецификации общего профиля OpenGL® ES 2.0.25 похоже, что ни один из них невозможен.

Раздел 4.4.2 гласит:

Изображения, присоединяемые к Framebuffer, могут быть прикреплены к созданные приложением объекты кадрового буфера. Напротив, изображение вложения из Предоставляемый оконной системой кадровый буфер не может быть изменен OpenGL ES .

(выделено мной) Так что второй вариант в вопросе невозможен.

В разделе 4.4.3 предполагается, что первый вариант также невозможен ...

Объект renderbuffer не может быть создан с имя ноль. Если renderbuffer равен нулю, то любая предыдущая привязка к цели нарушается и целевое связывание восстанавливается до исходного состояния.

В исходном состоянии зарезервированное имя ноль связано с RENDERBUFFER. Есть нет объекта renderbuffer, соответствующего нулевому имени, поэтому клиент пытается изменить или запрос состояния рендеринга буфера для цели RENDERBUFFER, пока ноль привязан, будет генерировать ошибки.

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

...