【发布时间】:2014-11-04 02:32:36
【问题描述】:
我发现如果我在 OpenGL ES 2.0 中使用glFramebufferTexture2D 将图元渲染到纹理,坐标系与渲染到默认帧缓冲区时的坐标系不同。例如:V0(-1,-1),我认为会在左下角,但如果我渲染到纹理,V0 会在右上角。谁能告诉我为什么?
【问题讨论】:
标签: opengl-es
我发现如果我在 OpenGL ES 2.0 中使用glFramebufferTexture2D 将图元渲染到纹理,坐标系与渲染到默认帧缓冲区时的坐标系不同。例如:V0(-1,-1),我认为会在左下角,但如果我渲染到纹理,V0 会在右上角。谁能告诉我为什么?
【问题讨论】:
标签: opengl-es
(-1, -1) 当然不应该映射到右上角。但它可能显示在左上角,具体取决于您如何看待数据。
实际上,(-1, -1) 在默认的 OpenGL 坐标系中始终位于左下角。它看起来令人困惑的原因是纹理在内存中的排列方式。它们从下到上存储,即内存中的第一行是最底部的行。这与大多数图像文件格式不同,其中第一行是最上面的行。这是大多数 y 反转问题的根本原因。
这可能会导致意外行为的几种情况:
您从文件中加载图像,该文件的格式从上到下存储数据,并将其用于采样。如果要以原始方向显示图像,则需要将底部顶点对应的 v 纹理坐标使用 1.0,顶部顶点使用 0.0,与顶点坐标使用的方向相反。使用 0.0 作为顶部纹理坐标会将纹理的第一行放在顶部,这与内存中的顺序匹配。
您使用默认设置执行glReadPixels()。结果中图像的行从下到上排序。如果要将数据保存为从上到下存储数据的图像格式,则需要在写出数据时翻转行的顺序。
您使用 FBO 渲染到纹理,然后使用此纹理进行采样。此纹理的行从下到上排列。与您在示例 1 中使用的坐标相比,v 纹理坐标现在翻转了,其中纹理数据从上到下排列。
【讨论】: