帧缓冲区大小和视口关系

Posted

技术标签:

【中文标题】帧缓冲区大小和视口关系【英文标题】:Framebuffer size and viewport relationship [closed] 【发布时间】:2017-11-22 12:40:21 【问题描述】:

我对帧缓冲区和视口之间的关系有点困惑。我有一个使用大小为 screenWidth+1 和 screenHeight 的主 FBO 的应用程序。我在宽度上添加了一个,因为它是我发现在 X11 中真正启用全屏的唯一方法(至少在我们使用的板上)。

在任何情况下,我都会根据 screenWidth 和 screenHeight 创建投影和相机矩阵(忽略 +1)。除了我们创建窗口和主 FBO 时,应用程序中实际上没有其他对此 +1 的引用。所以总而言之,我希望它能够正常工作,并且在我的 FBO 末尾有一个空的像素列。

我使用的视口设置为 glViewport(0, 0, screenWidth, screenHeight)。 y 坐标为 0,因为我的投影在 y 轴上翻转。这种情况已经有很长一段时间了,(我认为)由于 +1 没有人工制品。

但我做了一个快速测试并将 +1 更改为 +500 或其他一些大数字,我注意到场景中的一些对象向右移动了。 FBO 中的填充似乎会影响内容。

为什么会这样?据我了解,视口将标准化设备坐标转换为窗口坐标。因此,如果我通过对视口使用 screenWidth 和 screenHeight 来正确理解这一点,我应该只在 FBO 中填充一个 screenWidth x screenHeight 区域,不包括最后的额外像素。

有人可以解释一下吗?我是否必须更改视口以适应 FBO 的大小?

【问题讨论】:

由于您永远不会看到渲染到 FBO 中的数据,因此您必须做某事,以便它真正出现在屏幕上。 【参考方案1】:

我不知道全屏渲染需要额外的像素。

但是,您对视口的理解是正确的。它用于将标准化设备坐标(-1 到 +1)映射到 FBO 附件中的像素坐标。标准化设备坐标中的 (-1, -1) 是视口的左下角(glViewport() 的 x 和 y 参数)。 (+1, +1) 是视口的右上角。因此,FBO 中渲染表面的像素大小不会随着纹理附件的增大而改变。

渲染后,为了实际显示某些内容,您必须进行一些操作,将像素从渲染纹理传输到窗口的表示空间。这通常是default framebuffer。通常,您会将 blit 从渲染 FBO(可能具有多重采样)到默认帧缓冲区。我希望问题出在渲染管道的 blitting 部分。

【讨论】:

感谢您的澄清。问题是我在我的应用程序中使用了填充大小,包括投影和相机矩阵,所以一切都有些混乱。我确保我现在忽略了那个额外的像素并使用了正确的尺寸,一切看起来都很好。我将其标记为答案,因为它阐明了 FBO 的视口和颜色附件之间的关系。

以上是关于帧缓冲区大小和视口关系的主要内容,如果未能解决你的问题,请参考以下文章

是否可以仅使用 OpenGL 确定默认帧缓冲区的大小?

使用帧缓冲区对象 (FBO) 或?

多个视口与多个帧缓冲区之间的使用差异是啥?

WebGL - 从渲染缓冲区读取像素数据

使用帧缓冲区对象作为纹理的视觉问题

如何定义 QT Opengl 帧缓冲区的大小