因此,我正在尝试以比往常更高的分辨率进行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上)。我听说过有关像素缓冲对象的信息 - 使用其中一个可以防止管道摊位?
我提出的技术实际上适用于少数应用程序,但是大多数情况下它不起作用。
如果您只想提取颜色/深度缓冲区,则可以使用带有GlreadPixels的PBO池或使用GlblitFrameBuffer。如果延迟是一个问题,前者不是选择。后者效果很好(请参阅Reshade项目中的此示例)