前期文章:
這篇文章主要說明OpenGL裏面視口和座標相關的知識,
設置了MyRender,並實現內部的三個函數
@Override public void onSurfaceChanged(GL10 gl, int width, int height) { glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { }
在onSurfaceChanged中,我們調用了glViewport方法,Viewport爲視口,其函數如下:
glViewport(x, y, width, height);
在渲染之前,我們必須告訴OpenGL渲染窗口的尺寸大小,即OpenGL應該把渲染之後的圖形繪製在窗口的哪個部位。
參數x,y指定了視見區域的寬度和高度,即窗口左下角的位置。width,height,參數控制渲染窗口的寬度和高度(像素)。
視口座標系是標準的笛卡爾直角座標系,如下圖:如果我們設置x,y爲0,0,寬度和高度爲屏幕的座標,那麼顯示的就是GLSurview所在的全部區域。
如果我們改變x = 50, y = 100那麼就會如下所示。
視口座標系和窗口座標系是不同的,窗口座標系的0,0位置是位於左上角的,對比如下圖1:窗口座標和 圖2: 視口座標
圖1:窗口座標
視口座標
在android,我們操作點擊位置的座標系爲窗口座標系,要和OpenGL顯示的視口座標系區分開。
以上說的都是實際的屏幕的物理座標,在代碼處理中,無論是x座標還是y座標,OpenGL都會把屏幕映射到[-1,1]的範圍內。這意味着屏幕的座標對應x軸的-1,屏幕的右邊對應+1,屏幕的底邊對應y軸的-1,屏幕的頂邊對應+1。如下圖顯示:
因此,不管屏幕是什麼形狀和大小,始終都會映射到[-1,1]之間,實際在編寫相應代碼中,頂點位置的座標也始終在[-1,1]之間。