2014-10-27 130 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