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)