Android OPENGL 第一天:實現(xiàn)基本的圖形繪制

因為項目的一個將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璩取!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钉跷,一起剝皮案震驚了整個濱河市吕漂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尘应,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼虎,死亡現(xiàn)場離奇詭異犬钢,居然都是意外死亡,警方通過查閱死者的電腦和手機思灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門玷犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洒疚,你說我怎么就攤上這事歹颓。” “怎么了油湖?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵巍扛,是天一觀的道長。 經常有香客問我乏德,道長撤奸,這世上最難降的妖魔是什么吠昭? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮胧瓜,結果婚禮上矢棚,老公的妹妹穿的比我還像新娘。我一直安慰自己府喳,他們只是感情好蒲肋,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钝满,像睡著了一般兜粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舱沧,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天妹沙,我揣著相機與錄音,去河邊找鬼熟吏。 笑死距糖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的牵寺。 我是一名探鬼主播悍引,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帽氓!你這毒婦竟也來了趣斤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤黎休,失蹤者是張志新(化名)和其女友劉穎浓领,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體势腮,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡联贩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捎拯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪幌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖署照,靈堂內的尸體忽然破棺而出祸泪,到底是詐尸還是另有隱情,我是刑警寧澤建芙,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布没隘,位于F島的核電站,受9級特大地震影響禁荸,放射性物質發(fā)生泄漏升略。R本人自食惡果不足惜微王,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望品嚣。 院中可真熱鬧炕倘,春花似錦、人聲如沸翰撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶诈。三九已至涨醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逝撬,已是汗流浹背浴骂。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪潮,地道東北人溯警。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像狡相,于是被迫代替她去往敵國和親梯轻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345