Использование буферов глубины и цвета с разным разрешением (буфер глубины субдискретизации) - PullRequest
1 голос
/ 17 ноября 2011

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

Я настроил свой фрейм-буфер следующим образом:

// Color attachment
glBindTexture(GL_TEXTURE_2D, colorAttachment);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

// Depth attachment
glBindRenderbuffer(GL_RENDERBUFFER, depthAttachment);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 160, 90);

// Framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthAttachment);

Однако теперь glCheckFramebufferStatus(GL_FRAMEBUFFER) возвращаетGL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS, что означает «Не все прикрепленные изображения имеют одинаковую ширину и высоту» в соответствии с документацией .

Существует исследовательская работа под названием " Full-3D Edge Trackingс фильтром частиц", который описывает в разделе 3.5, что они фактически использовали буфер глубины субдискретизации для увеличения производительности в своем приложении.

Буфер глубины субдискретизации: смежные пиксели вдолькрая изображения настолько тесно связаны, что тестирование каждого отдельного края края является излишним.Для трекеров с одной гипотезой распространено распределение точек выборки на расстоянии 10-20 пикселей по краю.Выборка только каждого пикселя n-го края также уменьшает требуемую полосу пропускания графики, поэтому выборка выполняется только для каждого четвертого пикселя.Вместо явного рисования пунктирных линий это достигается с помощью буфера глубины с субдискретизацией 1018 * (160 x 120), поскольку это дополнительно обеспечивает уменьшение полосы пропускания для очистки и заполнения буфера глубины.Однако это также означает, что удаление скрытой линии может быть неточным приблизительно до четырех пикселей.Кроме того, на точность системы это не влияет.

Единственные очевидные обходные пути:

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

Оба подхода нене похоже, что они были бы самыми эффективными идеями.Каков самый чистый способ получения буфера глубины субдискретизации?

1 Ответ

2 голосов
/ 17 ноября 2011

Страница документа, на которую вы ссылались, относится к OpenGL ES 1.0 и 2.0. OpenGL wiki содержит больше информации о разнице между 2.0 и 3.0, а именно то, что начиная с 3.0 (и ARB_framebuffer_object), текстуры кадрового буфера могут быть разных размеров.Однако, если я правильно помню, когда у вас есть прикрепленные текстуры разных размеров, фактический используемый размер текстуры является пересечением всех прикрепленных текстур FBO.Я не думаю, что это то, что вы хотите.

Чтобы уменьшить размер вашей текстуры глубины, я предлагаю использовать glBlitFramebuffer для преобразования вашей большой текстуры в меньшую.Эта операция полностью выполняется на GPU, поэтому она очень быстрая.Окончательная текстура меньшего размера может затем использоваться в качестве входных данных для дальнейших операций рендеринга в ваших шейдерах, которые определенно обеспечат экономию полосы пропускания.Вместо того, чтобы выполнять усреднение нескольких значений глубины для каждого выполнения пиксельного шейдера, оно будет выполнено один раз на тексель в меньшей текстуре.Меньшая текстура также является более быстрой для выборки, поскольку она лучше помещается в кэш-память.

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

...