帧缓冲区大小和视口关系

Framebuffer size and viewport relationship

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

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

我使用的视口设置为glViewport(0, 0, screenWidth, screenHeight)。 y 坐标为 0,因为我的投影在 y 轴上翻转。很长一段时间以来都是这样,而且(我认为)没有因 +1 而产生的人工制品。

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

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

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

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

不过,你对viewport的理解是对的。它用于将规范化的设备坐标(-1 到 +1)映射到 FBO 附件中的像素坐标。标准化设备坐标中的 (-1, -1) 是视口的左下角(glViewport() 的 x 和 y 参数)。 (+1, +1) 是视口的右上角。因此,当您使纹理附件变大时,FBO 中渲染表面的像素大小不会改变。

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