opengl 學習筆記

1.初始化gl

setEGLContextClientVersion(2);??//申明使用版本號

setRenderer(renderer=new FGLRender(this));??//設置渲染器

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); //渲染模式

--說明:1.再考慮到適配較低版本手機時候,可能會需要驗證當前手機支持的版本



ActivityManager activityManager = (ActivityManager) getSystemServi(ACTIVITY_SERVICE);

if (activityManager == null){

throw new NullPointerException();

}

ConfigurationInfo deviceConfigurationInfo = activityManager.getDeviceConfigurationInfo();

if (deviceConfigurationInfo.reqGlEsVersion < 0x20000){

throw new UnSupportGlVersionException("unspport egl version");

}

2.關于渲染模式:一般情況下GLSurfaceview會在單獨一個線程中,調(diào)用渲染器的方法,默然會以顯示設備的刷新頻率不斷地渲染,可以設置renderMode為RENDERMODE_WHEN_DIRTY表示按請求渲染



2.編輯render

創(chuàng)建繪制圖形坐標,opengl繪制圖像都是映射在[-1,1]的范圍內(nèi),定義點的順序,最好也按照逆時針這種卷曲順序,這樣可優(yōu)化性能

以正方形為例:



final float cubePositions[] = {

-0.5f,-0.5f,??//一個三角形

0.5f,0.5f,

-0.5f,0.5f,

-0.5f,-0.5f,

0.5f,-0.5f,??//一個三角形

0.5f,0.5f,

-0.5f,0f,

0.5f,0f,????//一條線

0f,-0.25f,

0f,0.25f???//一條線

};

創(chuàng)建緩沖數(shù)組

mVertexData = ByteBuffer.allocateDirect(cubePositions.length * BYTES_PER_FLOAT)

.order(ByteOrder.nativeOrder())

.asFloatBuffer();

mVertexData.put(cubePositions);

mVertexData.position(0);

首先分配一塊本地內(nèi)存(不是垃圾管理機制控制),大小為頂點數(shù)組占字節(jié)數(shù)(一個float4個字節(jié)),

然后order按照本地字節(jié)序組織內(nèi)容,最后調(diào)用asFloatBuffer()可以避免操作字節(jié),而直接操作浮點數(shù)

引入shader

1.頂點著色器(vertex shader):用于生成每個頂點的最終位置,點位置確定,這樣opengl就可以將點組裝成點,直線,以及三角形

2.片段著色器(fragment shader):為組裝的點,直線,或者三角形的每個片段生成顏色

創(chuàng)建頂點著色器:

attribute vec4 a_Position;

void main()

{

gl_Position = a_Position;

}

片元著色器:

precision mediump float;

uniform vec4 u_Color;

void main()

{

gl_FragColor = u_Color;

}

加載著色器

現(xiàn)將之前寫好的著色器讀出來,按照各自的方式編譯頂點著色器(GLES20.GL_VERTEX_SHADER),片元著色器(GLES20.GL_FRAGMENT_SHADER)

int shaderObjectId = GLES20.glCreateShader(type);??//創(chuàng)建一個新的著色器對象,并返回id,返回值為0時及失敗

GLES20.glShaderSource(shaderObjectId,shaderCoder);??//上傳源代碼,將其關聯(lián)到上一步的id

GLES20.glCompileShader(shaderObjectId);???//編譯改著色器


我們可以檢查這個著色器是否編譯成功

final int[] compileStatus = new int[1];

GLES20.glGetShaderiv(shaderObjectId,GLES20.GL_COMPILE_STATUS,compileStatus,0);

if (compileStatus[0] == 0){??//編譯失敗

GLES20.glDeleteShader(shaderObjectId);

Log.e(TAG,"Compilation of shader failed");

return 0;

}


將著色器鏈接到opengl程序

int programeObjectId = GLES20.glCreateProgram();??//創(chuàng)建一個opengl程序

if (programeObjectId == 0){

Log.e(TAG,"create program failed");

return 0;

}

GLES20.glAttachShader(programeObjectId,vertexShaderId);???//附上著色器

GLES20.glAttachShader(programeObjectId,fragmentShaderId);

GLES20.glLinkProgram(programeObjectId);???//將所有著色器鏈接起來


也可以使用城西來檢查鏈接是否成功

final int[] linkStatus = new int[1];

GLES20.glGetProgramiv(programeObjectId,GLES20.GL_LINK_STATUS,linkStatus,0);

if (linkStatus[0] == 0){

GLES20.glDeleteProgram(programeObjectId);

Log.e(TAG,"link programe failed");

return 0;

}


告訴opengl 著色器繪制的位置

GLES20.glUseProgram(program);

mUniformLocation = GLES20.glGetUniformLocation(program, U_COLOR);??//獲取顏色位置

mAttribLocation = GLES20.glGetAttribLocation(program, A_POSITION); //獲取屬性位置

GLES20.glVertexAttribPointer(mAttribLocation,POSITION_COPOMENT_COUNT,GLES20.GL_FLOAT,false,0,mVertexData);??//告訴opengl 從緩沖區(qū)讀取數(shù)據(jù),就能找到a_position的位置數(shù)據(jù)

GLES20.glEnableVertexAttribArray(mAttribLocation);??//告訴opengl到哪里去找其他數(shù)據(jù)

開始繪制

GLES20.glUniform4f(mUniformLocation,1.0f,1.0f,1.0f,1.0f); //更新著色器代碼中u_Color的值 ,后面的值分別代表RGBA

GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,6); //繪制一個三角形,從數(shù)組第0個開始讀,6個長度,這就繪制了兩個三角形

//繪制下面的線和點

GLES20.glUniform4f(mUniformLocation,1.0f,0.0f,0.0f,1.0f);

GLES20.glDrawArrays(GLES20.GL_LINES,6,2);

GLES20.glUniform4f(mUniformLocation,0.0f,0.0f,1.0f,1.0f);

GLES20.glDrawArrays(GLES20.GL_POINTS,8,1);

GLES20.glUniform4f(mUniformLocation,1.0f,0.0f,0.0f,1.0f);

GLES20.glDrawArrays(GLES20.GL_POINTS,9,1);


待續(xù).................................................

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肉迫,一起剝皮案震驚了整個濱河市布蔗,隨后出現(xiàn)的幾起案子渔工,更是在濱河造成了極大的恐慌琳要,老刑警劉巖列赎,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶诡,死亡現(xiàn)場離奇詭異焰坪,居然都是意外死亡此疹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門士聪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辱姨,“玉大人,你說我怎么就攤上這事戚嗅。” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵懦胞,是天一觀的道長替久。 經(jīng)常有香客問我,道長躏尉,這世上最難降的妖魔是什么蚯根? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮胀糜,結果婚禮上颅拦,老公的妹妹穿的比我還像新娘。我一直安慰自己教藻,他們只是感情好距帅,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著括堤,像睡著了一般碌秸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悄窃,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天讥电,我揣著相機與錄音,去河邊找鬼轧抗。 笑死恩敌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的横媚。 我是一名探鬼主播纠炮,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分唾!你這毒婦竟也來了抗碰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绽乔,失蹤者是張志新(化名)和其女友劉穎弧蝇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體折砸,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡看疗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睦授。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两芳。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖去枷,靈堂內(nèi)的尸體忽然破棺而出怖辆,到底是詐尸還是另有隱情是复,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布竖螃,位于F島的核電站淑廊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏特咆。R本人自食惡果不足惜季惩,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腻格。 院中可真熱鬧画拾,春花似錦、人聲如沸菜职。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽些楣。三九已至脂凶,卻和暖如春愁茁,著一層夾襖步出監(jiān)牢的瞬間蚕钦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工鹅很, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘶居,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓促煮,卻偏偏與公主長得像邮屁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菠齿,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容