因為項目的一個將GLSurface的界面效果導出成為MP4文件,我做的很難看援雇,導出的視頻很不理想,然后我就只能自學一下
openGL是一個跨平臺的東西,不管安卓還是ios都可以用军熏,他也是一些游戲繪制的基礎,openGL也是圖形學的研究工具卷扮,今天我就帶讀者一起搞一下openGL荡澎,本人剛剛大學畢業(yè)均践,對圖形學這個東西不熟,剛開始寫的不對的摩幔,別噴我彤委!
openGL具體是什么,原理是什么或衡,我就用白話說一下焦影,這樣子方便理解:
opengl其實是一個開放的圖形庫接口,可以適用很多平臺封断,Windows斯辰,macos,Android坡疼,ios彬呻,Linux,因為不管你是什么系統(tǒng)柄瑰,你肯定要使用到3D圖形闸氮,所以這個東西必不可少。當然教沾,你想學會這個玩意蒲跨,還需要一定的數(shù)學功底還有幾何的數(shù)學基礎。我就舉個很簡單的例子:
假如你想實現(xiàn)一個三角形的圖形授翻,在安卓上或悲,先跟著我的思路來:
剛開始你肯定要新建一個GLSurface的view用來顯示東西,OK:
GLSurfaceView view =new GLSurfaceView(this);
但是你創(chuàng)建以后藏姐,那怎么讓他顯示你想要的東西呢隆箩?你看一下gl繼承啥?
public class GLSurfaceView? extends SurfaceView implements Callback2 {....}
????他繼承是SurfaceView 羔杨,大家可以想一下捌臊,為什么要繼承這個,而不是繼承其他的兜材,必須View或者ViewGroup理澎,GL他是一個圖形接口,讓GLSurfaceview去展示對應的圖形曙寡,就打個比方糠爬,你玩王者榮耀的時候,如果人物一卡一卡的举庶,你是不是很難受执隧,然后安卓的自己的view的刷新頻率是跟不上的,會炸掉,平常手機拍照镀琉,就不會很卡峦嗤,但是手機拍照是拿什么現(xiàn)實的呢?是surfaceview屋摔,為什么不卡呢烁设?因為你拍照的時候,你要不斷刷新你當前攝像頭的畫面钓试,所以你必須得提高你的刷新頻率装黑,讓人的肉眼看不到刷新的效果,所以GL繼承Surfaceview是一個不錯的選擇弓熏,所以GL不僅僅是作為一個圖形庫接口恋谭,也可以用來播放視頻,錄像等高頻率刷新的操作挽鞠。
????然后我們繼續(xù):我們創(chuàng)建了一個GL箕别,那怎么樣才可以讓他渲染出來東西,你有一張紙了滞谢,那是不是得有一個畫筆,這個畫筆就是渲染器(Renderer)
public interface Renderer {
????void onSurfaceCreated(GL10 var1, EGLConfig var2);
? ? void onSurfaceChanged(GL10 var1, int var2, int var3);
? ? void onDrawFrame(GL10 var1);
}
????他是一個GLSurfaceView的內部接口除抛,包括了界面初始化(void onSurfaceCreated(GL10 var1, EGLConfig var2))狮杨,視圖窗體改變(void onSurfaceChanged(GL10 var1, int var2, int var3)),視圖繪制(?void onDrawFrame(GL10 var1))等三個接口回調到忽,之前提到的快頻率的刷新就是在onDrawFrame里面進行刷新的
? ? 當你有一個畫筆橄教,你畫畫是不是得做好采樣點,也就是所謂的坐標系喘漏,因為在安卓手機里面需要有一個坐標系規(guī)定每個圖形的顯示位置护蝶,包括大小,旋轉角度以及方向翩迈,都是由坐標系進行決定的持灰。但是openGL 的坐標系是什么樣子的呢?
? ? 我們一般畫二維的负饲,還是三維的堤魁,都是用笛卡爾坐標系,但是你得有一個原點(0,0,0)返十,然后在根據(jù)原點去定圖形的位置方向等妥泉。
????坐標原點默認在屏幕的中間,即(width/2,height/2)位置上,z軸是從屏幕"內"指向屏幕外,而且還要注意原點和x,y軸平面是在屏幕的"表面",有引號,這個"表面"剛好是人看不到的面,所以如果你要畫一條線,線端點(1,0,0),(0,1,0),直接畫到屏幕上,將看不到顯示,怎么辦?很簡單,這個坐標系是三維空間的,那么就將坐標系沿Z軸的負軸方向移動一點,將X,Y平面稍微向屏幕內部移動一點,就能夠看到直線了,想象一下在三維空間中,將坐標系往屏幕里面推一下,那么x,y軸形成的平面就在屏幕里面了,在它上面的直線就可以看見了。
? ? 這個坐標系和安卓的傳統(tǒng)坐標系是不是有一點不一樣洞坑,因為GL是三維的成像模型盲链,所以Z軸是必須要存在的,不過你可能用不到,但是也必須得要刽沾!那你有一個坐標系了本慕,那你是不是得有一個視角(gluLookAt),這個將決定你對于物體的觀察成像是什么樣子的悠轩?不過一般是從Z軸看里面间狂,我一般設置為:
GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0,1,0);
然后還有規(guī)定的顯示區(qū)域大小:
GL10#glViewport(0, 0, width, height)
一般是將屏幕的寬高做為界面規(guī)定區(qū)域的寬高
作為頻繁刷新的view火架,那你還得有一個清屏色鉴象,一般是黑色,然后GL提供了一個方法:
GL10#glColor4f(0f, 0f, 0f, 1f);
參數(shù)分別為R,G,B和Alpha
基本的參數(shù)都設置好了何鸡,那我們就開始畫三角形
三角形要有三個點纺弊,三個點的坐標(X,Y),從坐標軸上拾取骡男,我們可以初步定為
float[] coords = {
????????0f,0.5f,0f,
? ? ? ? -0.5f,-0.5f,0f,
? ? ? ? 0.5f,-0.5f,0f,
};
那你肯定好奇了淆游,為什么都寫一起了,不分開寫隔盛,我先不說犹菱,我們繼續(xù),你寫好三個點的坐標以后吮炕,然后我們就把他畫出來腊脱,問題是咋告訴計算機,我們要的是一個三角形呢龙亲?GL給我們提供了內置的參數(shù):
GL10#glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
大家好奇了陕凹,這三個參數(shù)是什么意思呢?第一個還好說鳄炉,是繪制一個三角形的參數(shù)杜耙,第二個和第三個呢?第二個參數(shù)0是告訴計算機拂盯,從第0個點開始繪制佑女,第0個點是什么呢?看上面的數(shù)組谈竿,0珊豹,0.5,0榕订,這就是第一個點店茶,那為什么是三個數(shù)字呢?因為GL的坐標系有X,Y,Z啊劫恒,所以確定一個點需要3個坐標系以前確認啊贩幻,所以得有三個點轿腺,那第1個和第2個點大家都知道是多少了吧!那就直接傳入到方法參數(shù)里面丛楚,然后畫出來就好了族壳,顯示的效果我截個屏:
那你好奇了,為什么這個三角形是紅色的呢趣些?難道GL自己給他著色了嗎仿荆?不對的,這個是我自己設置的坏平,怎么設置呢拢操?上代碼:
GL10#glColor4f(1f, 0f, 0f, 1f)
這個是設置圖形的顏色的,R,G,B,Alpha舶替,R是1 就是紅色了令境,其他的都是0,所以這樣子就好理解了顾瞪,那假如我畫了兩個圖形呢舔庶,那我咋分開繪制不同的顏色呢?我明天再更新3滦选L璩取!