帧缓冲区大小和视口关系

时间:2017-11-22 12:40:21

标签: opengl graphics viewport fbo

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

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

我使用的视口设置为glViewport(0,0,screenWidth,screenHeight)。 y坐标为0,因为我的投影在y轴上翻转。它已经很长一段时间了(我认为)由于+1而没有任何文物。

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

为什么会出现这种情况?据我所知,视口将标准化设备坐标转换为窗口坐标。因此,如果我通过对视口使用screenWidth和screenHeight来正确理解这一点,我应该在FBO中填充screenWidth x screenHeight区域,不包括末尾的额外像素。

有人可以对此有所了解吗?我是否必须更改我的视口以适应FBO的大小?

1 个答案:

答案 0 :(得分:1)

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

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

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