OpenGL ES 2.0 坐标系

Posted

技术标签:

【中文标题】OpenGL ES 2.0 坐标系【英文标题】:OpenGL ES 2.0 coordinate system 【发布时间】:2014-10-27 01:47:21 【问题描述】:

我在iphone上使用opengl es 2.0渲染一个图元,我使用shader和glFramebufferTexture2D渲染到纹理,但是结果和我期望的不一样,我发现整个坐标都在混乱,我给出的顶点数据是这个 V0 (-1, -1, -1) V1 (0 , -1,01), V2 (-1,0, -1) 我预期的结果应该是这样的第一张图像,但结果确实像第二张案例。我发现整个坐标系就像这个沿绿色箭头的折叠一样,请告诉我这是怎么回事?

好的,我发现了问题,如果我不使用glFramebufferTexture2D,这个结果就像第三张图片一样。所以谁能告诉我为什么?

【问题讨论】:

【参考方案1】:

好吧,openGL 中的真实坐标系是这样工作的,left 和 bottom 位于 -1,right 和 top 位于 1。接下来是渲染缓冲区的原点也在“左下角”。因此,当您在屏幕上显示图像时,您希望将 Y 坐标反转,以使顶部处于 -1 或者更确切地说是 0,但这仅用于显示。

因为它适用于纹理,您不应该尝试反转它,而是将原点保持在左下方。您必须了解,一旦绘制到纹理上,这些像素就是简单的 RGBA 像素数据,并且当纹理被重新用于显示(或者如果您读取这些像素)时,它们将从自然的角度看是颠倒的。

我不确定所有这些是否足够合乎逻辑,但您通常会反转场景,因此您看到的是正确的,但所有这些都与 GPU 上缓冲区的实际顺序无关。例如,如果您能够简单地替换缓冲区中第一个像素的 RGBA 数据,那么该像素实际上将位于屏幕的左下角而不是左上角。

所以在处理FBO时最好保持openGL的顺序,只有在绘制到将呈现到屏幕的缓冲区时才反转场景。

【讨论】:

现在的问题是,如果我直接渲染,并且我期望相同的结果,如果我渲染到纹理(使用 glFramebufferTexture2D)并且外观位置与我预期的不同。

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

OpenGL ES 2.0 摄像机与投影

OpenGL ES 2.0 渲染管线 学习笔记

Android OpenGL ES和OpenGL一起学------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)

OpenGL ES 3.0(五)坐标系

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

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)