OpenGL挂钩 - 渲染到任意大小的FBO

时间:2017-12-23 07:28:40

标签: c linux opengl hook glx

所以我试图以比平时更高的分辨率使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的情况下获取绘制到默认帧缓冲区(即颜色缓冲区和深度缓冲区)上的内容。理想情况下,有一种方法可以以纹理的形式访问这些数据(因此它已经在GPU上)。我听说过像素缓冲区对象的事情 - 会使用其中一种来阻止管道阻塞吗?

1 个答案:

答案 0 :(得分:1)

我提出的技术实际上适用于少数应用程序,但大部分时间它都不起作用。

如果您只想提取颜色/深度缓冲区,可以使用glReadPixels的PBO池或使用glBlitFramebuffer。如果延迟是一个问题,前者不是一个选择;后者工作得相当好(参见example项目中的reshade