Моя сцена организована в группы элементов, которые составляют 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 и не разбивая рендеринг объектов по ним на основе местоположения объекта?