2014-10-27 176 views
0

我在iphone上使用opengl es 2.0渲染一个图元,我使用着色器和glFramebufferTexture2D渲染纹理,但结果不一样,我期望,我发现整个坐标都处于混乱状态,我给出的顶点数据是这个V0(-1,-1,-1)V1(0,-1,01),V2(-1,0,-1)我预期的结果应该是这样的第一个图像,但结果确实是第二种情况。我发现整个坐标系就像这个绿色箭头一样,请告诉我这是怎么回事? first imageOpenGL ES 2.0坐标系

second image

好吧,我发现这个问题,如果我不使用glFramebufferTexture2D,这个结果是正确的,如第三图像。所以,谁可以告诉我为什么?

third

回答

0

那么,在openGL的真实坐标系统的工作原理,使左侧和底部都在-1,右侧和顶部都在1接下来的事情就是渲染缓冲器起源也是在“底部左“角。所以会发生什么情况是,当您向屏幕呈现图像时,要将Y坐标倒置,以使顶部处于-1或宁可置于0处,但这仅用于显示。

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

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

因此,最好在处理FBO时保持事物的openGL顺序,并且只在绘制到将呈现给屏幕的缓冲区时才反转场景。

+0

现在的问题是,如果我直接渲染,并且我期望得到相同的结果,如果我渲染到纹理(使用glFramebufferTexture2D)并且外观位置与我预期的不一样。 – HelloWorld 2014-10-30 02:00:38