【问题标题】:How to create another viewport only for save to image?如何创建另一个视口仅用于保存到图像?
【发布时间】:2014-06-14 17:35:20
【问题描述】:

我想创建两个视口。 第一个是正常显示。 第二个仅用于保存到图像,例如每分钟保存到新图像。 怎么做? 谢谢~

【问题讨论】:

    标签: opengl viewport


    【解决方案1】:

    您可以使用两种方法:

    1) 帧缓冲区 (http://www.opengl.org/wiki/Framebuffer),它本质上是您可以在其上进行绘图调用的第二帧。对帧缓冲区进行的任何渲染都会保存到内部纹理对象中,然后您可以抓取该对象并对其进行任何操作。附带说明一下,您可以使用帧缓冲区来制作全屏效果(绽放、抗锯齿等)

    2) 然而,更有可能的是,您正在寻找 glReadPixels (https://www.opengl.org/sdk/docs/man/html/glReadPixels.xhtml)。这是一个快速函数调用,您可以在完成绘图调用后进行,但您换出缓冲区(假设您正在使用双缓冲上下文进行绘图)。此函数将从您刚刚发出绘图调用的帧缓冲区中复制选择的像素,并将它们以数组的形式提供给您,您可以再次使用它来做任何您想做的事情。这样做的好处是您不必忍受创建第二个“视口”的麻烦(我认为您的意思是帧缓冲区?),您可以将像素从最终显示给用户的同一帧缓冲区中复制出来.

    如果您有任何问题,请告诉我!

    【讨论】:

    • 为了清楚起见,glReadPixels 不一定要从您正在绘制的同一个缓冲区中读取(而且它通常不是您所谓的快速函数调用,因为它会强制 CPU /GPU 同步,除非您使用 PBO)。如果它这样做,大多数时候它并不是特别有用,但 GL 实际上确实保持了单独的 Draw 和 Read 缓冲区状态。这就是为什么您链接到的手册页在“另见”下列出了glReadBuffer
    • @AndonM.Coleman:感谢有关读写缓冲区状态的提示,我不知道。至于 glReadPixels 是一个缓慢的函数,是的,没错,但我认为由于 sam 只希望每分钟获取一次图像,平均而言帧速率不会受到太大影响
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多