OpenGL Hooking——渲染成任意大小的 FBO
OpenGL Hooking -- Rendering to an arbitrarily-sized 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
除以表示其屏幕分辨率的制服(从屏幕 space 转换为纹理坐标)来执行纹理查找(对于 screen-space 操作) .
如果无法调整输出大小,我想知道是否可以在不使用 glReadPixels
的情况下获得绘制到默认帧缓冲区(即颜色和深度缓冲区)的内容。理想情况下,会有一种方法以纹理的形式访问此数据(因此它已经在 GPU 上)。我听说过有关像素缓冲区对象的事情——使用其中一个可以防止管道停顿吗?
所以我正在尝试使 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
除以表示其屏幕分辨率的制服(从屏幕 space 转换为纹理坐标)来执行纹理查找(对于 screen-space 操作) .
如果无法调整输出大小,我想知道是否可以在不使用 glReadPixels
的情况下获得绘制到默认帧缓冲区(即颜色和深度缓冲区)的内容。理想情况下,会有一种方法以纹理的形式访问此数据(因此它已经在 GPU 上)。我听说过有关像素缓冲区对象的事情——使用其中一个可以防止管道停顿吗?