如何以多种分辨率最有效地渲染图片

  • 本文关键字:有效地 分辨率 opengl
  • 更新时间 :
  • 英文 :


我渲染的所有内容都应该有两种不同的分辨率:一种是动态的,根据用户的窗口设置,另一种是恒定的,用于网络流传输。

现在,我们使用双PBO方法在渲染循环结束时有效地从GPU中读取像素。一旦我们得到像素,我们就把它们加载到纹理中,缩放它,并再次读取像素。

但也许可以告诉OpenGL在同一渲染循环中以2种不同分辨率渲染图片?

现在,我们使用双PBO方法在渲染循环结束时有效地从GPU中读取像素。一旦我们得到像素,我们就把它们加载到纹理中,缩放它,并再次读取像素。

最坏的情况是:您将像素数据推送两次通过外围总线的瓶颈。使用PBO,可以使用glCopyBufferSubData从GL_PIXEL_PACK_BUFFER传输到GL_PIXEL_UNPACK_BUFFER,然后从那里传输到纹理中。但这并不是很优雅,还有优化的空间。

因此,您实际上应该做的是:使用FBO渲染到一个纹理中,该纹理足够大,可以满足屏幕显示分辨率和存储流的纵横比。假设你的屏幕显示是1920×500,但你的流是1280×720,然后你会创建一个1920×1080的纹理,将其附加到FBO并渲染到它。然后,为了在屏幕上显示图片,您渲染纹理,顶部和底部以1:1的映射裁剪到主帧缓冲区。

对于渲染到附加到FBO的1280×720渲染缓冲区的流。但是要小心,你必须缩小规模,生成mipmaps相当慢(而且glGenerateMipmaps的质量在许多实现中都不是最好的)。因此,您应该实现一个适当的下采样片段着色器。你很难缩小超过8倍。因此,您的下采样内核将相当简单;基于傅立叶变换的下采样也可以工作。使用它可以渲染到所述渲染缓冲区,并使用glReadPixels(可能通过PBO)读回图像以进行流式传输。为了获得glReadPixels的最佳性能,您必须指定一个与从中读取的缓冲区的内部格式完全匹配的读回格式。对于屏幕上的系统缓冲区来说很巧妙,但对于自定义渲染缓冲区来说微不足道。

但也许可以告诉OpenGL在同一渲染循环中以2种不同分辨率渲染图片?

不,不是真的。虽然最近的OpenGL确实支持多个视口,但基本体总是光栅化到只有一个视口。视口决定了从NDC空间到像素空间的映射,因此它们与结果图片的分辨率紧密耦合。

而且这样做绝对没有好处。如果可能的话,这意味着每个片段操作必须进行两次。这将是浪费时间。以更高的分辨率渲染然后对结果进行下采样要容易得多。

最新更新