3

很快:我需要一种快速的方法来调整缓冲区图像的大小,然后将像素返回给我以将它们保存到文件等。

目前我首先使用 glReadPixels(),然后我自己通过像素来使用我自己的调整大小函数调整它们的大小。

有什么方法可以加快调整大小,例如让 OpenGL 为我完成这项工作?我想我可以在启用 miplevel 和 mipmapping 的情况下使用 glGetTexImage(),但正如我之前注意到的,该功能在我的 GFX 卡上存在错误,所以我无法使用它。

我只需要一个 miplevel,它可以是 1 到 4 之间的任何值,但不是全部,以节省一些 GPU 内存。那么是否可以只生成一个所需大小的 miplevel?

注意:我不认为我可以使用多重采样,因为我需要对模板测试进行像素精确渲染,所以如果我用多重采样渲染它,它会产生模糊的像素,并且它们会因模板测试和遮罩而失败,结果将不正确(AFAIK) . 编辑:我只想缩放颜色(RGBA)缓冲区!

4

2 回答 2

2

创建所需目标大小的帧缓冲区,并使用完全调整大小的缓冲区大小的纹理四边形绘制源图像。然后使用 glReadPixels 读取调整大小的帧缓冲区内容。

伪代码:

unbind_texture(OriginalSizeFBOattachmentColorTex);

glBindFramebuffer(OriginalSizeFBO);
render_picture();

glBindFramebuffer(TargetSizeFBO); // TargetSizeFBO used a Renderbuffer color attachment
glBindTexture(OriginalSizeFBOattachmentColorTex);
glViewport(TargetSize);
render_full_viewport_quad_with_texture();

glReadPixels(...);
于 2012-10-12T13:30:51.777 回答
2

如果您有 OpenGL 3.0 或其他EXT_framebuffer_blit可用的(很可能 - 自 2005 年左右以来的所有 nVidia 卡,自 2008 年左右以来的所有 ATI 卡,甚至英特尔高清显卡都声称支持它),那么您可以glBlitFramebuffer[EXT]进入更小的帧缓冲区(带有分别较小的矩形)并让显卡完成工作。
请注意,即使您要说“我不需要原来的”,您也永远无法在同一个帧缓冲区内安全地重新缩放,因为重叠的 blit 是未定义的(允许,但未定义)。

或者,您当然可以使用简单的缩小像素着色器(如果您愿意,可以使用aniso 抽取)绘制全屏四边形。

事实上,由于您在最后一段中提到了模板……如果您要重新缩放模板(或深度),那么您最明确地想要使用着色器绘制全屏四边形,因为它很可能不会给出否则期望的结果。通常,在这种情况下,人们会选择一个max过滤器而不是插值(例如,对模板值 0 和 10 进行插值可以得到什么合理、有意义的结果——需要其他东西,例如“任何非零”或“最大值”)样本区域中的值”)。

于 2012-10-12T12:23:48.443 回答