你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> OpenGL ES 響應屏幕旋轉 iOS

OpenGL ES 響應屏幕旋轉 iOS

編輯:IOS技巧綜合
[摘要]本文是對OpenGL ES 響應屏幕旋轉 iOS的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

iOS下使用OpenGL 如果使用GLKit View 那麼不用擔心屏幕旋轉的問題,說明如下:

If you change the size, scale factor, or drawable properties of a GLKit view, it automatically deletes and re-creates the appropriate framebuffer objects and renderbuffers the next time its contents are drawn.

GLKit view 自動設置好了 framebuffer 和 renderbuffer 對象,使用者直接設置具體的OpenGL 參數即可。但是GLKit view 在iOS10 下存在一些問題,不能使用,只能繼承最簡單的UIView,那麼所有相關的設置都需要自己完成。

所以也要自己處理屏幕旋轉的事件。如果參考Android的設計,解決思路就是在屏幕旋轉的時候將所有的對象銷毀再根據當前的屏幕狀態重新創建。簡單粗暴但是效率不行。我想不銷毀對象的情況下,直接重新設置寬高數據讓OpenGL繪制出正確的圖像。於是我調用了如下的函數:

    glViewport(0, 0, (GLsizei) (size.width * scale), (GLsizei) (size.height * scale));
    _renderController->InitUniforms((int) (size.width * scale), (int) (size.height * scale));

首先設置viewport 然後第二行 InitUniforms 函數具體做的事情就是重新設置投影矩陣。很遺憾,這樣的做法沒有效果,將屏幕從豎屏旋轉到橫屏時,得到的結果如下:

上半部分什麼也沒有,下半部分扭曲嚴重。

問題出在 renderbuffer

Yes, the renderbuffer must be recreated when the interface is rotated, and set to the new size.

來源

所以還需要重新創建renderbuffer,

// first DELETE buffers
glDeleteRenderbuffers(...);
glDeleteFramebuffers(...);
// recreate
glGenFramebuffers(1, &_framebuffer);
glGenRenderbuffers(1, &_renderbuffer);

// bind buffer and set framebuffer and renderbuffer...

具體代碼可以參考Recreating the render buffer causes a crash on 3GS device (OpenGL ES 1.1)


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved