Частичная перерисовка в FBO OpenGL - PullRequest
1 голос
/ 13 апреля 2019

Моя сцена организована в группы элементов, которые составляют FBO, поддерживаемые текстурами с плавающей запятой (16 бит с альфа-каналом). Эти FBO затем смешиваются вместе сверху вниз, чтобы создать финальную сцену. Все FBO имеют размер экрана. Когда размер экрана становится большим (> 2048 на Intel HD Graphics 630), частота кадров резко падает. Это связано с проблемами со скоростью заполнения (я экспериментировал с листами без опций и меньшими форматами текстур, чтобы убедиться в этом). Есть ли способ превратить часть FBO в часть другого FBO? Может быть, что-то вроде этого, прежде чем рисовать текстурированный квад:

void FrameBufferManager::SetViewportFromClipBox(const Geometry::BoundingBox& clipBox)
{
    const auto& lowerLeft = clipBox.GetLowerLeft();
    const auto lx = static_cast<GLsizei>(lowerLeft.x);
    const auto ly = static_cast<GLsizei>(lowerLeft.y);
    const auto width = static_cast<GLsizei>(clipBox.GetWidth());
    const auto height = static_cast<GLsizei>(clipBox.GetHeight());
    glViewport(lx, ly, width, height);
    glScissor(lx, ly, width, height);
}

В вершинных шейдерах геометрия преобразуется так, что точки вне clipBox будут выходить за пределы ((-1, -1) (1, 1)). Вышеуказанное гарантирует, что пиксели вне clipBox не будут расходовать пропускную способность / скорость заполнения памяти графического процессора? Если нет, то есть ли способ сделать это, не создавая кучу небольших FBO и не разбивая рендеринг объектов по ним на основе местоположения объекта?

1 Ответ

1 голос
/ 13 апреля 2019

Есть ли способ превратить часть FBO в часть другого FBO?

Начиная с OpenGL ES 3.0 вы можете использовать glBlitFramebuffer:

glBlitFramebuffer - скопировать блок пикселей из буфера кадров чтения в буфер кадров рисования

void glBlitFramebuffer(
    GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
    GLbitfield mask, GLenum filter);

Эта функция также предоставляется расширением NV_framebuffer_blit , которое написано для OpenGL ES 2.0.

...