androidopengles
『壹』 如何查看android系統的openGL版本
android中查看手機系統的OpenGL版本,可以使用如下代碼進行查詢:
java">ActivityManageram=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfoinfo=am.getDeviceConfigurationInfo();
info.reqGlEsVersion=0x00010001//代表opengles1.1
info.reqGlEsVersion=0x00020000//代表opengles2.0
ActivityManager是Android框架的一個重要部分,它負責一新ActivityThread進程創建,Activity生命周期的維護。ActivityManagerProxy實現了介面IActivitManager,但並不真正實現這些方法,它只是一個代理類,真正動作的執行為Stub類ActivityManagerService,ActivityManagerService對象只有一個並存在於system_process進程中,ActivityManagerService繼承於ActivityManagerNative存根類。
『貳』 Android OpenGLES2.0(十八)——輕松搞定Blend顏色混合
Blend是OpenGL中的一個非常重要的部分,它可以讓每個輸出的源和目的顏色以多種方式組合在一起,以呈現出不同的效果,滿足不同的需求。
在OpenGLES1.0中,Blend在OpenGLES固定的管線中,OpenGLES2.0相對1.0來說,更為靈活。在OpenGLES2.0中,與Blend相關的函數及功能主要有:
Blend的使用比較簡單,但是如果不理解Blend的這些函數及參數的意義,使用了錯誤的參數,就難以獲得我們所期望的混合結果了。
想要使用Blend, glEnable(GL_BLEND) 當然是必須的。與之對應的,不需要Blend的時候,我們需要調用 glDisable(GL_BLEND) 來關閉混合。
另外的四個方法,看名字差不多就能知道他們的意義了。
glBlendFunc 和 glBlendFuncSeparate 都是設置混合因子,反正就是這么個意思了。區別在於glBlendFunc是設置RGBA的混合因子,而glBlendFuncSeparate是分別設置RGB和Alpha的混合因子。設置混合因子是做什麼的呢?繼續看。
glBlendEquation 和 glBlendEquationSeparate 都是設置Blend的方程式,也就是設置混合的計算方式了,具體參數後面說。他們的區別在同 glBlendFunc 和 glBlendFuncSeparate 的區別一樣。
顏色、因子、方程式,組合起來就是:最終顏色=(目標顏色 目標因子)@(源顏色 源因子),其中@表示一種運算符。
至於glBlendColor則是在glBlendFunc和glBlendFuncSeparate的設置中,因子可以設置和常量相關的,這個常量就是由glBlendColor設置進去的。
glBlendFuncSeparate設置混合因子,參數及它們表示的主要如下,而glBlendFunc的參數也是這些,表示的意義就是RGB和A合並為RGBA就是了。在下表中,s0表示源,d表示目的,c表示有glBlendColor設置進來的常量。
glBlendEquationSeparate的設置混合操作,參數及其意義如下表所示。通過glBlendEquationSeparate或者glBlendEquation設置的方程中,源和目的顏色分別為(Rs,Gs,Bs,As)
和(Rd,Gd,Bd,Ad)。最終混合的顏色結果為(Rr,Gr,Br,Ar)。源和目的的混合因子分別為(sR,sG,sB,sA)和(dR,dG,dB,dA)
。其中,所有的顏色分量的取值范圍都為[ 0, 1 ]。 GL_MIN和GL_MAX是在OpenGLES3.0才有的 。
Mode RGB Components Alpha Component
GL_FUNC_ADD RrGrBr=sRRs+dRRd=sGGs+dGGd=sBBs+dBBd
Ar=sAAs+dAAd
GL_FUNC_SUBTRACT RrGrBr=sRRs−dRRd=sGGs−dGGd=sBBs−dBBd
Ar=sAAs−dAAd
GL_FUNC_REVERSE_SUBTRACT RrGrBr=dRRd−sRRs=dGGd−sGGs=dBBd−sBBs
Ar=dAAd−sAAs
GL_MIN RrGrBr=min(Rs,Rd)=min(Gs,Gd)=min(Bs,Bd)
Ar=min(As,Ad)
GL_MAX RrGrBr=max(Rs,Rd)=max(Gs,Gd)=max(Bs,Bd)
Ar=max(As,Ad)
目的紋理和源紋理使用的圖片分別如下所示(作為源的圖片為了表現混合效果,上中下三部分用了不一樣的透明度,最下面部分不透明):
根據公式推敲下渲染的結果:
『叄』 android中使用OpenGLES,有什麼方法可以將texture反過來轉化成Bitmap的方法沒有
你可以先將GLES20環境裡面的上下文設置好
獲取好之後就可以將GLSurfaceview 的輸入texture 轉給GLES20.
然後通過GLES20.glBindFrameBuffer(GLES20.GL_FRAMEBUFFER,framebuffer)
然後調用GLES20.glFrameBufferTexture2D(xx,xxx,xxx,inputtexture ,xxx)
IntBuffer intbuffer = new IntBuffer(previewWidth,previewHeight);
intbuffer.order(ByteOrder.little.ENDLAN);
intbuffer.rewind();
GLES20.glReadPixels(0,0,previewWidth,previewHeight,GLES20.GL_RED,GLES20.GL_UNSLGLED_BYTE,Intbuffer);
bitmap = Bitmap.createBitmap(bitmapSource, iw, ih, Bitmap.Config.ARGB_8888);
最後將bitmap = Bitmap.create(intbuffer,previewWidht,previewHeight,Bitmap.Config.ARGB_8888);
『肆』 Android OpenGLES2.0(十六)——3D模型貼圖及光照處理(obj+mtl)
在Android OpenGLES2.0(十四)——Obj格式3D模型載入中實現了Obj格式的3D模型的載入,載入的是一個沒有貼圖,沒有光照處理的帽子,為了呈現出立體效果,「手動」加了光照,擁有貼圖的紋理及光照又該怎麼載入呢?
本篇博客例子中載入的是一個卡通形象皮卡丘,資源是在網上隨便找的一個。載入出來如圖所示:
obj內容格式如下:
mtl文件內容格式如下:
關於Obj的內容格式,在上篇博客中已經做了總結,本篇博客中使用的obj,可以看到f後面的不再跟的是4個數字,而是 f 2/58/58 3/59/59 17/60/60 這種樣子的三組數,每一組都表示為頂點坐標索引/貼圖坐標點索引/頂點法線索引,三個頂點組成一個三角形。而頭部的 mtllib pikachu.mtl 則指明使用的材質庫。
而mtl格式文件中,主要數據類型為:
模型載入和之前的模型載入大同小異,不同的是,這次我們需要將模型的貼圖坐標、頂點法線也一起載入,並傳入到shader中。其他參數,有的自然也要取到。
模型載入以obj文件為入口,解析obj文件,從中獲取到mtl文件相對路徑,然後解析mtl文件。將材質庫拆分為諸多的單一材質。obj對象的 載入,根據具使用材質不同來分解為多個3D模型。具體載入過程如下:
頂點著色器
片元著色器
完成了以上准備工作,就可以調用 readMultiObj 方法,將obj文件讀成一個或多個帶有各項參數的3D模型類,然後將每一個3D模型的參數傳入shader中,進而進行渲染:
『伍』 Android OpenGLES 瀹炴椂緹庨(紓ㄧ毊)鐨勪紭鍖(浜)
鍦ㄥ墠涓綃囨枃絝 Android OpenGLES 瀹炴椂緹庨(紓ㄧ毊)鐨勪紭鍖 錛屾垜浠宸茬粡浠嬬粛浜嗗叧浜庡疄鏃剁編棰(紓ㄧ毊)鐨勪竴浜涗紭鍖栫偣銆備絾鍦ㄥ疄闄呯殑浼樺寲嫻嬭瘯涓鍙戠幇錛屽綋澶勭悊鍣ㄥ彂鐑涔嬪悗錛屽氨鏃犳硶淇濊瘉棰勮堝撫鐜囦簡錛屼富瑕佽繕鏄楂樻柉妯$硦澶勭悊鐨勬暟鎹閲忔瘮杈冨ぇ瀵艱嚧銆傚洜姝わ紝鎴戜滑闇瑕佸繪壘鏂扮殑紓ㄧ毊鏂規硶銆
鐩鍓嶅競闈涓婂叧浜庣(鐨鏂規硶鏈夊ソ澶氱嶏紝浣跨敤PS紓ㄧ毊緇忓父鐢ㄥ埌鐨勬柟娉曞寘鎷楂樺弽宸淇濈暀銆侀珮浣庨戙佷腑鎬х伆浠ュ強鍙岀嚎鎬х瓑銆傚叾涓涓鎬х伆鍜屽弻綰挎х殑鏁堢巼涓鑸錛屽洜姝わ紝鎴戜滑浠庨珮鍙嶅樊淇濈暀銆侀珮浣庨戣繖涓ょ嶆柟娉曚腑閫夋嫨銆傝繖閲岄夋嫨浣跨敤楂樺弽宸淇濈暀娉曞仛紓ㄧ毊澶勭悊錛孭S涓鐨勯珮鍙嶅樊淇濈暀娉曡繘琛岀(鐨錛岄殢鎵嬩竴鎼滀究鑳芥壘鍒板緢澶氭枃絝狅紝姣斿傦細
https://jingyan..com/article/455a99504d568fa1662778d6.html
鎺ヤ笅鏉ワ紝鎴戜滑灝濊瘯鐫瀹炵幇鏂囩珷涓璁插埌鐨勮繃紼嬨
鍏充簬楂樻柉妯$硦鐨勪紭鍖栵紝鍙浠ュ弬鑰冩湰浜虹殑鏂囩珷錛
OpenGLES婊ら暅寮鍙戞眹鎬 鈥斺 楂樻柉妯$硦瀹炵幇浠ュ強浼樺寲
瀵逛簬浜哄儚榪涜岄珮鏂妯$硦錛屾垜浠璁捐′竴涓11x11鐨勯珮鏂綆楀瓙瀵瑰浘鍍忚繘琛岄珮鏂妯$硦錛宻hader濡備笅錛
vertex shader :
fragment shader:
緇忚繃浠ヤ笂鐨剆hader榪涜岄珮鏂妯$硦澶勭悊涔嬪悗錛屾垜浠寰楀埌榪欐牱涓寮犻珮鏂妯$硦鍥懼儚錛
鍦≒S鐨勯珮鍙嶅樊淇濈暀紓ㄧ毊鏂規硶涓錛岄珮鍙嶅樊淇濈暀紓ㄧ毊娣峰悎閲囩敤鐨勬槸寮哄厜妯″紡錛岃$畻鍏寮忎負錛歝olor = 2 * color1 * color2銆傚洜姝わ紝鎴戜滑璁捐″嚭榪欐牱涓涓楂橀氭護娉㈠櫒錛屽叾shader濡備笅錛
fragment shader:
緇忚繃楂橀氭護娉㈠櫒涔嬪悗錛屾垜浠寰楀埌榪欐牱涓涓綰圭悊鍥懼儚錛
鍙浠ョ湅鍒幫紝緇忚繃涓夐氶亾寮哄厜娣峰悎澶勭悊鍚庯紝鐥樺嵃銆佽竟娌跨瓑鍦版柟閮芥竻鏅拌搗鏉ヤ簡銆傚己鍏夌殑紼嬪害錛屼竴鑸鏄3鐨勫嶆暟錛岃繖閲屽彇24鍊嶃
鍒拌繖涓姝ワ紝鍏跺疄鎴戜滑宸茬粡寰楀埌浜嗛渶瑕佽繃婊ら滆壊鍊礆紝浣嗗湪榪欎竴寮犲浘涓錛屼篃鎶婅竟娌跨殑棰滆壊宸鍊煎寘鍚榪涙潵浜嗐傛垜浠鎺ヤ笅鏉ラ渶瑕佽繃婊ゆ帀杈規部鐨勯滆壊宸鍊箋傝繖鏍峰湪鍚庣畫鐨勫勭悊涓錛屾垜浠鍙浠ヤ繚鐣欒竟娌跨殑緇嗚妭涓嶈妯$硦鎺夈傚洜姝ゆ帴涓嬫潵錛屾垜浠闇瑕佸皢緇忚繃楂橀氭護娉㈠緱鍒扮殑綰圭悊錛屽啀鍋氫竴嬈¢珮鏂妯$硦銆備笉榪囪繖涓嬈′笉鑳11 x11 榪欎箞澶х殑楂樻柉綆楀瓙錛屾垜浠閫夋嫨涓涓 5 x 5 澶у皬鐨勯珮鏂綆楀瓙銆傞珮鏂妯$硦鐨剆hader 濡備笅錛
vertex shader:
fragment shader:
灝嗛珮閫氭護娉㈠櫒寰楀埌鐨勭汗鐞嗭紝緇忚繃楂樻柉妯$硦澶勭悊鍚庯紝寰楀埌榪欐牱涓寮犵汗鐞嗭細
瀵規瘮楂橀氭護娉㈠櫒澶勭悊鍚庣殑綰圭悊錛岃竟娌跨粏鑺傚彉寰楁ā緋婁簡錛岃屼笖錛岄渶瑕佽繃婊ょ殑棰滆壊宸鍊間粛鏃т繚鐣欑潃銆傚埌榪欎竴姝ワ紝鎴戜滑灝卞緱鍒頒簡鍋氱(鐨澶勭悊鐨勫墠緗綰圭悊銆傛帴涓嬫潵灝辨槸楂樺弽宸淇濈暀紓ㄧ毊鐨勬渶鍚庝篃鏄鏈閲嶈佺殑涓姝ャ
緇忚繃鍓嶉潰鐨勫勭悊錛屾垜浠寰楀埌涓寮犺緭鍏ュ浘鐗囩殑楂樻柉妯$硦綰圭悊錛屼互鍙婁竴寮犻珮鍙嶅樊淇濈暀鐨勯珮鏂妯$硦綰圭悊銆傛垜浠浣跨敤榪欎袱寮犵汗鐞嗭紝閫氳繃姣旇緝钃濊壊閫氶亾錛岃$畻鍑洪渶瑕佺(鐨鐨勫疄闄呭己搴﹀礆紝涓庡師鍥捐繘琛屾販鍚堝勭悊錛岀劧鍚庤緭鍑烘渶緇堢殑綰圭悊銆俿hader濡備笅鎵紺猴細
緇忚繃涓婇潰鐨勫勭悊涔嬪悗錛屾垜浠灝卞緱鍒扮(鐨澶勭悊鐨勭粨鏋滃備笅錛
鍙浠ョ湅鍒幫紝緇忚繃楂樺弽宸淇濈暀紓ㄧ毊鍚庣殑緇撴灉錛岀(鐨鏁堟灉榪樹笉閿欙紝鑰屼笖720P紓ㄧ毊澶勭悊鏃訛紝鍦ㄩ珮閫氶獊榫625澶勭悊鍣ㄤ笂錛岀粡榪囬珮鍙嶅樊淇濈暀紓ㄧ毊涔嬪悗錛岄勮堝撫鐜囪兘澶熶繚鎸佸湪30FPS宸﹀彸銆傛垜浠鍙浠ョ湅鍒幫紝杈規部緇嗚妭榪樻槸涓嶅熸槑鏄撅紝鎵浠ワ紝鎴戜滑鍙浠ヤ嬌鐢║SM閿愬寲澧炲己杈規部緇嗚妭閮ㄥ垎銆傝繖綃囨枃絝犲氨涓嶈茶ВUSM閿愬寲鐨勫疄鐜頒簡銆
璇︾粏瀹炵幇榪囩▼錛屽彲浠ュ弬鑰冩湰浜虹殑寮婧愮浉鏈洪」鐩錛
CainCamera
CainCamera鐨凢ilterLibrary涓鏈夌粡榪囦紭鍖栧悗鐨勫疄鏃剁編棰(紓ㄧ毊)瀹炵幇銆