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