c++ - 受窗口大小影响的 OpenGL 帧缓冲区

标签 c++ opengl opengl-es glsl

我正在使用带有 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

最佳答案

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

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

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

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

关于c++ - 受窗口大小影响的 OpenGL 帧缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19251450/

相关文章:

opengl - 在 autoconf 脚本中处理非标准库位置的正常方法是什么?

opengl - 如何使用GLSL在Processing 2.2.1中设置glPointSize?

android - 压缩纹理在 Android 中变为白色

android - 为什么我的 OpenGL fragment 在更新时停止重绘?

c++ - 使用C++提取数据包信息

c++ - 程序结束时进程返回 0xC0000005

opengl - 与片段着色器中的所有顶点不同,没有插值。为什么不?

c++ - 双倍作为实数的默认数据类型

c++ - 为什么每次使用 std::random_device 和 mingw gcc4.8.1 运行都会得到相同的序列?

iphone - 为什么剔除会删除该立方体未被遮挡的面?