从framebuffer对象读取时,OpenGL纹理坐标相反

时间:2018-01-06 03:31:14

标签: opengl textures framebuffer sampling

如果我将一个纹理从文件图像加载到OpenGL中并创建一个垂直放置的平面,如果我将左上顶点设置为纹理坐标(0,0),那么该点的纹理将在左上角进行采样。您在应用程序中打开的图像。

然而,当我渲染到帧缓冲区,并将其颜色附件绑定为纹理时,带有坐标(0,0)的左上顶点将从底部左侧进行采样,如果将此帧缓冲区显示到屏幕。换句话说,当从帧缓冲纹理中采样时,Y似乎被反转。

我是否将glClipControl设置为GL_UPPER_LEFT或GL_LOWER_LEFT,此纹理采样行为是相同的,即,它将采样帧缓冲纹理的左下角视为(0,0)。我注意到了这一点,因为我将GUI渲染到帧缓冲区,然后渲染到默认的帧缓冲区,而正常的图像纹理从图像左上角的文件样本(0,0)加载,在采样时似乎相反来自帧缓冲纹理:

enter image description here

这是正常的吗?我可以这样做,以便从帧缓冲纹理采样(0,0)是topleft吗? glClipControl(GL_UPPER_LEFT)对这个特定的东西没有任何影响?我很困惑。

1 个答案:

答案 0 :(得分:2)

我认为以不同的方式看待它可能会解决问题。

纹理坐标(0,0)不是指纹理的左上角或左下角像素,而是指纹理的第一个像素。类似地(1,1)不是指右下角或右上角的像素,而是指最后一个像素。

在OpenGL中,纹理的第一个像素被认为是左下角的像素。

但是,在大多数图像格式中,按照惯例,文件中的第一个像素被视为左上角像素。

换句话说,从OpenGL的角度来看,当图像加载到纹理中时,纹理实际上是颠倒的。

这解释了为什么渲染目标的采样与从图像文件加载的图像之间存在差异。

那么glClipControl(GL_UPPER_LEFT, ...)呢?

调用glClipControl(GL_UPPER_LEFT, ...)对纹理采样没有影响。它不会影响图像的采样方式,第一个像素仍然是第一个像素。

它的作用是将帧缓冲区翻转过来。因此,当渲染目标在(0,0)处被采样时,它仍会对第一个像素进行采样,但现在它与调用glClipControl(GL_UPPER_LEFT, ...)之前的像素相反。