0

我正在使用带有 GLSL 着色器的 OpenGL 来进行一些图像处理。我基本上使用带有正交投影的帧缓冲区来多次渲染我的图像(每个都有不同的片段着色器设置)。

然后我有 2 个带有纹理的帧缓冲区,我在它们之间来回渲染(例如,tex1 连接到 fb1,tex2 连接到 fb2。第一遍将输入纹理渲染到 fb1,第二遍将 tex1 渲染到 fb2,第三遍将 tex2 渲染到 fb1... 来回),直到最后一次从任何纹理渲染到输出帧缓冲区。

所有这些都是使用正交投影完成的,因此不会丢失任何图像。在调整窗口大小之前,这一切都很好。如果我将窗口的高度降低一半,则图像最终仅绘制在左侧窗口的上半部分(这是一次通过,2 次通过,它将仅在窗口的顶部 1/4 结束)。谁能理解为什么会这样?

第二张图片是在将窗口大小调整为原始高度的 3/4 之后

http://i567.photobucket.com/albums/ss112/davidc538/rtip1.png

http://i567.photobucket.com/albums/ss112/davidc538/rtip2.png

4

1 回答 1

1

调整大小时,您似乎没有更新纹理尺寸。即,您的窗口已调整大小,但您仍在调整其初始尺寸。

  • Pass 1 写入 tex1(附加到 fb1)
  • Pass 2将tex1(附加到fb1)写入tex2(fb2)
  • 通过 3 将 tex2 写回 tex1
  • 通过 3 将 tex1 写回 tex2

这意味着您在每次通过时都在缩小/放大图像。

您可以通过在调整大小期间更新 fbo 来避免这种情况(我建议四舍五入到最接近的较大的二次幂),或者将 fbo 保持在固定大小并始终渲染到整个窗口(尽管您的图像会是渲染到大窗口时模糊)。

于 2013-10-08T16:06:50.267 回答