从帧缓冲区对象读取时 OpenGL 纹理坐标相反

OpenGL texture coordinates are opposite when reading from a framebuffer object

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

然而,当我渲染到帧缓冲区并将其颜色附件绑定为纹理时,坐标为 (0, 0) 的左上角顶点将从左下角采样,如果显示此帧缓冲区,将会看到到屏幕。换句话说,当从帧缓冲区纹理中采样时,Y 似乎是倒置的。

无论我将 glClipControl 设置为 GL_UPPER_LEFT 还是 GL_LOWER_LEFT,此纹理采样行为都是相同的,即,它将采样帧缓冲区纹理的左下角视为 (0, 0) .我注意到这一点是因为我将我的 GUI 渲染到帧缓冲区,然后渲染到默认帧缓冲区,而从图像左上角的文件样本 (0, 0) 加载的普通图像纹理,从图像中采样时似乎相反帧缓冲区纹理:

这是正常的吗?我可以让帧缓冲区纹理的采样 (0, 0) 位于左上角吗? glClipControl(GL_UPPER_LEFT) 对这个特定的东西没有任何影响?我很困惑。

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

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

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

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

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

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

现在 glClipControl(GL_UPPER_LEFT, ...) 呢?

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

它的作用是颠倒渲染帧缓冲区。因此,当渲染目标在 (0, 0) 处采样时,它仍会采样第一个像素,但现在它与调用 glClipControl(GL_UPPER_LEFT, ...) 之前的状态相反。