OpenGL ES有不同的UV坐标?

Posted

技术标签:

【中文标题】OpenGL ES有不同的UV坐标?【英文标题】:OpenGL ES has different UV coordinates? 【发布时间】:2011-12-23 18:46:34 【问题描述】:

我使用带有纹理映射的 OpenGL ES 1.1。我一直认为纹理的 UV 坐标系从左上角开始,到右下角。这在android上很好,我已经测试过了。但是,如果我在桌面上使用 Qt 对其进行测试,我的 UV 坐标系从左下角开始到右上角。那样可以么?我正在使用相同的代码来设置 OpenGL

glViewport(0, 0, m_screenWidth, m_screenHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

#ifdef DESKTOP_QT
glOrtho(0, 1, 0, 1, -1, 1);
#else
glOrthof(0, 1, 0, 1, -1, 1);
#endif

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

我也想知道,为什么Qt不支持glOrthof而Android不支持glOrtho?两个框架中是否有共同的功能?

【问题讨论】:

【参考方案1】:

默认情况下,在 OpenGL 中,纹理坐标 (0,0) 对应于纹理的左下角。自从 OpenGL 存在以来,它一直是(并且可能永远是)这样。

不过,您可以通过更改纹理矩阵或仅存储从下到上翻转的纹理来更改此约定。

顺便说一句,glOrtho 与 Qt 或 Android 无关,它是一个 OpenGL 函数。所以你可能遇到的不是 Qt 和 Android 之间的区别,而是桌面 OpenGL 和 OpenGL ES 之间的区别。但在两个版本中,纹理坐标应该从左下角开始。

【讨论】:

你可以看这里 youtube.com/… 这是斯坦福大学的 OpenGL ES 教程,我怀疑那个人可能是错的。 UV 坐标应从左上角开始 @user1113852 也许这家伙谈到了理论纹理概念或其他什么。但在 OpenGL 中,纹理坐标系从左下角开始。如果你再问我,你可以用粗体和大写字母得到它。 你可以使用任何你想要的字母,但我在安卓上仍然有我的 y-down UV 坐标。看在上帝的份上,为什么会这样? 你的相机倒置了吗?当您调用 glOrtho 或 glPerspective 时,您设置“相机”朝向的方向,包括向上/向下的方向。我遇到了类似的问题,这是因为当我调用 GLOrtho 时,我正在反转视口。 另一个问题可能是你如何加载纹理。加载文件时,大多数图像处理库会将纹理读取到左上角原点 0,0 的数据结构中。如果您需要一些示例代码,请告诉我。【参考方案2】:

你怎么知道纹理是从左下角开始到右上角的?我从来没有听说过这种纹理映射的方向。

【讨论】:

事实上,OpenGL 就是这样做的,并且从一开始就会这样做。 @ChristianRau 我可以建议稍微礼貌一点吗?我知道他说他不同意你的观点可能激怒了你的自尊心,但你不必开始对你的回答方式进行讽刺。如果你不能保持冷静,那就走开,找点别的事做。 @AscensionSystems 我不会真的认为该评论不礼貌或过度讽刺。他自己说从未听说过这种类型的纹理映射方向,当用于回答有关 OpenGL 的问题时,这是一个相当强烈的词(这种类型的方向一直是并且将永远是标准的) )。但是,如果您觉得它不礼貌、政治不正确或傲慢,请随时将其标记为冒犯。 @ChristianRau “如果你再问我一次,你可以用粗体和大写字母得到它” - 这非常强大。我觉得没有必要标记任何东西,只是说如果你发现有人正在寻求帮助但不愿意接受正确的答案,那就让它成为他们的问题,而不是让它来找你。 :) @AscensionSystems 啊,你的意思是另一个答案。好吧,我不得不承认这个评论可能有点太讽刺了,明白了。

以上是关于OpenGL ES有不同的UV坐标?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 4 - 三角带立方体的 UV 坐标

关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]

opengl 高级技巧

梳理 Opengl ES 3.0 顶点坐标变换

OpenGL ES 3.0(五)坐标系

OpenGL ES总结OpenGL坐标变换之平移及旋转