Перехват рендеринга OpenGL в FBO произвольного размера

Поэтому я пытаюсь сделать рендеринг приложения OpenGL с более высоким разрешением, чем обычно. Я уже создал общую библиотеку, которая перехватывает большинство соответствующих функций GLX/OpenGL. Вот мой текущий подход (на высоком уровне):

When my hooked SwapBuffers() is called
    Unbind my FBO
    Call the (original/unhooked) SwapBuffers()
    Bind my FBO
    Set the viewport to (0, 0, HIGH_RES_X, HIGH_RES_Y)
    Set the scissor region to (0, 0, HIGH_RES_X, HIGH_RES_Y)
    return

Этот подход не работает для (большинства) приложений. Я подозреваю, что это связано с тем, что некоторые приложения выполняют поиск текстур (для операций с экранным пространством) путем деления glFragCoord.xy на униформу, которая представляет их разрешение экрана (для преобразования из экранного пространства в координаты текстуры).

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


person AnimatedRNG    schedule 23.12.2017    source источник
comment
Этот подход не будет работать для любого приложения, которое выполняет рендеринг в собственные буферы кадра. Они должны привязывать их к каждому кадру и, таким образом, устанавливать область просмотра и все остальное по своему усмотрению.   -  person Nicol Bolas    schedule 23.12.2017
comment
Мой первоначальный подход также перехватывал glBindFramebuffer, чтобы он заменял вызовы glBindFramebuffer(GL_FRAMEBUFFER, 0) для привязки моего фреймбуфера. Другие вызовы glBindFramebuffer не будут затронуты. Я бы также подключил glViewport, чтобы убедиться, что разрешение рендеринга всегда такое, какое я хочу, предполагая, что другой FBO не привязан.   -  person AnimatedRNG    schedule 23.12.2017
comment
Это тоже сломано. Фреймбуфер по умолчанию не ведет себя как обычный FBO. Например, перечислители glDrawBuffers совершенно разные.   -  person Nicol Bolas    schedule 23.12.2017


Ответы (1)


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

Если вы просто хотите извлечь буфер цвета/глубины, вы можете либо использовать пул PBO с glReadPixels, либо использовать glBlitFramebuffer. Первое не подходит, если вас беспокоит задержка; последний работает достаточно хорошо (см. этот пример из проекта reshade)

person AnimatedRNG    schedule 03.01.2018