【问题标题】:OpenGL ES 2.0 Render to texture coordinate systemOpenGL ES 2.0 渲染到纹理坐标系
【发布时间】:2014-11-04 02:32:36
【问题描述】:

我发现如果我在 OpenGL ES 2.0 中使用glFramebufferTexture2D 将图元渲染到纹理,坐标系与渲染到默认帧缓冲区时的坐标系不同。例如:V0(-1,-1),我认为会在左下角,但如果我渲染到纹理,V0 会在右上角。谁能告诉我为什么?

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    (-1, -1) 当然不应该映射到右上角。但它可能显示在左上角,具体取决于您如何看待数据。

    实际上,(-1, -1) 在默认的 OpenGL 坐标系中始终位于左下角。它看起来令人困惑的原因是纹理在内存中的排列方式。它们从下到上存储,即内存中的第一行是最底部的行。这与大多数图像文件格式不同,其中第一行是最上面的行。这是大多数 y 反转问题的根本原因。

    这可能会导致意外行为的几种情况:

    1. 您从文件中加载图像,该文件的格式从上到下存储数据,并将其用于采样。如果要以原始方向显示图像,则需要将底部顶点对应的 v 纹理坐标使用 1.0,顶部顶点使用 0.0,与顶点坐标使用的方向相反。使用 0.0 作为顶部纹理坐标会将纹理的第一行放在顶部,这与内存中的顺序匹配。

    2. 您使用默认设置执行glReadPixels()。结果中图像的行从下到上排序。如果要将数据保存为从上到下存储数据的图像格式,则需要在写出数据时翻转行的顺序。

    3. 您使用 FBO 渲染到纹理,然后使用此纹理进行采样。此纹理的行从下到上排列。与您在示例 1 中使用的坐标相比,v 纹理坐标现在翻转了,其中纹理数据从上到下排列。

    【讨论】:

    • 哦,谢谢,这个问题困扰了我很久,不过现在我好像已经知道是怎么回事了,所以,非常感谢! @Reto Koradi
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2012-04-08
    • 2014-10-28
    • 2016-07-23
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多