Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何以多分辨率最有效地渲染图片?_Opengl - Fatal编程技术网

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

Opengl 如何以多分辨率最有效地渲染图片?,opengl,Opengl,我渲染的所有内容都应该有两种不同的分辨率:一种是动态的,根据用户的窗口设置,另一种是恒定的,用于网络流 现在,我们使用双PBO方法在渲染循环结束时从GPU高效读取像素。一旦我们得到像素,我们将它们加载到纹理中,缩放它并再次读取像素 但也许可以告诉OpenGL在同一个渲染循环中以2种不同的分辨率渲染图片 现在,我们使用双PBO方法在渲染循环结束时从GPU高效读取像素。一旦我们得到像素,我们将它们加载到纹理中,缩放它并再次读取像素 最坏的情况是:您两次将像素数据推过外围总线的瓶颈。使用PBO,您可以

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

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

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

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

最坏的情况是:您两次将像素数据推过外围总线的瓶颈。使用PBO,您可以使用
glCopyBufferSubData
从GL_像素_PACK_缓冲区传输到GL_像素_UNPACK_缓冲区,然后从那里传输到纹理。但这样做并不十分优雅,并为优化留下了空间

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

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

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

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

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