opengles30編程指南
㈠ openGL 2.0該怎麼安裝
完成工具的安裝以後,繼續在Eclipse中創建一個新的Android項目。項目名稱雖然不重要,但是該節將與主要活動有關,因此應認真學習掌握。首先看一段代碼:/**新建一個GLSurfaceView對象*/;GLSurfaceView是一個特殊的視圖,它為我們管理OpenGL表面並將其繪制到Android視圖系統中。它還添加許多可以簡化OpenGL使用的功能,包括但並不局限於:它為OpenGL提供一個專用的渲染線程,使主線程得以繼續。它支持連續或按需渲染,維護屏幕設置以及OpenGL和底層窗口系統之間的介面。代碼如下:@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);mGLSurfaceView=newGLSurfaceView(this);//檢測系統是否支持OpenGLES2.=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);=activityManager.getDeviceConfigurationInfo();finalbooleansupportsEs2=configurationInfo.reqGlEsVersion>=0x20000;if(supportsEs2){mGLSurfaceView.setEGLContextClientVersion(2);mGLSurfaceView.setRenderer(newLessonOneRenderer());}else{return;}setContentView(mGLSurfaceView);}在onCreate()方法裡面主要是創建OpenGLES2.0上下文以及做一些初始化工作。在onCreate()中,調用超類之後的第一件事情就是創建GLSurfaceView。然後確定系統是否支持OpenGLES2.0。因此,我們需要一個可以與全局系統狀態相交互的ActivityManager實例,以及使用這個實例來得到設備配置信息,該信息將通知我們設備是否支持OpenGLES2.0。一旦確定設備是否支持OpenGLES2.0後,就會通知表面視圖需要一個與OpenGLES2.0相兼容的視圖,然後傳遞一個自定義渲染。這個渲染將在任何需要調整表面或者繪制一個新的幀的時候被系統調用。我們還通過傳遞一個不同的渲染來支持OpenGLEs1.x,盡管可能由於APIs的不同,導致我們需要編寫不同的代碼,但在這一節中,我們將只關注OpenGLES2.0。最後,我們為GLSurfaceView設置內容視圖,它通知Android活動內容應該填補OpenGL表面,代碼如下:@OverrideprotectedvoidonResume(){super.onResume();mGLSurfaceView.onResume();}@OverrideprotectedvoidonPause(){super.onPause();mGLSurfaceView.onPause();}GLSurfaceView要求我們在任何父Activity的onResume()和onPause()方法被調用的時候調用onResume()和onPause()方法。
㈡ 如何搭建開發OpenGLES的開發環境,包括軟體和硬體平台
首先,下載網盤裡面的MDK 4.72a(或者以上版本)並安裝,最好先不要用5.0的版本。別忘了和諧:)
之後,下載Jlink驅動並安裝。
之後,下載附件中的nRF51822的SDK(兩周前發布的5.0版本)並安裝。有的壇友反映winxp安裝不上,這個原因可能是沒有裝Microsoft .NET Framework。安裝之後到「\ARM\Device\Nordic\」下面就能看到SDK的所有源碼了。
今天就寫了這么多,很多壇友還沒收到開發板。想要搶跑的壇友請看附件里的《上手指南》,這是開發板到手後必看的文檔!裡面把下一顆要講的都寫得很清楚了
㈢ OpenGLes2.0 什麼是Pbuffer
OpenGLES讓崩潰東西Andorid手機做三D用我記些筆記享吧: Android OpenGL ES簡介 二00一一-陸-三 Android系統使用OpenGL標准介面支持三D圖形功能android 三D圖形系統java框架本代碼兩部 本代碼主要實現OpenGL介面庫Java框架層javax.microedition.khronos.openglesjava標准OpenGL包 android.opengl包提供OpenGL系統Android GUI系統間聯系 Android本代碼位於frameworks/base/opengl, JNI代碼位於frameworks/base/core/com_google_android_gles_jni_GLImpl.cppframeworks/base/core/com_google_android_gles_jni_EGLImpl.cpp java類位於opengl/java/javax/microedition/khronos 本測試代碼位於frameworks/base/opengl/tests包括angeles、fillrate等一四測試代碼些代碼都通終端進行本調用測試(模擬器使用adb shell) OpenGL ES 一.x 固定管線操作支持glVertexPointer()等函數支持GLSL文件ndkGLES目錄庫文件libGLESv一_CM.so OpenGL ES 二.x 編程管線操作兼容一.x支持固定管線操作例glVertexPointer()等函數支持GLSL(必須用編程)文件ndkGLES二目錄庫文件libGLESv二.so OpenGL ES習 二0一一-陸-三0 OpenGL定義自數據類型應該堅持使用些OpenGL數據類型保證移植性效率 OpenGL ES 目前支持陸四位數據類型 OpenGL ES 支持三邊形 OpenGL ES 支持gl函數glu庫都支持 OpenGL ES OpenGL刪除功能: 一. glBegin/glEnd 二. glArrayElement 三. 顯示列表 四. 求值器 5. 索引色模式 陸. 自定義裁剪平面 漆. glRect 吧. 圖像處理(般顯卡沒FireGL/Quadro顯卡) 9. 反饋緩沖 一0. 選擇緩沖 一一. 累積緩沖 一二. 邊界標志 一三. glPolygonMode 一四. GL_QUADS,GL_QUAD_STRIP,GL_POLYGON 一5. glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib 一陸. TEXTURE_一D、TEXTURE_三D、TEXTURE_RECT、TEXTURE_CUBE_MAP 一漆. GL_COMBINE 一吧. 自紋理坐標 一9. 紋理邊界 二0. GL_CLAMP、GL_CLAMP_TO_BORDER 二一. 消失紋理代表 二二. 紋理LOD限定 二三. 紋理偏限定 二四. 紋理自壓縮、解壓縮 二5. glDrawPixels,glPixelTransfer,glPixelZoom 二陸. glReadBuffer,glDrawBuffer,glCopyPixels OpenGL ES 二.0 二0一一-一0-9 二.0一.一兼容 - 二.0使用文件ndkinclude目錄GLES二目錄gl二.h,gl二ext.h,gl二platform.h一.一使用GLES目錄 - 二.0使用庫文件ndklib目錄libGLESv二.so一.一使用libGLESv一_CM.so - 二.0取消一.一函數例glMatrixModelglLoadIdentity等 OpenGL著色語言(GLSL――OpenGL Shading Language) - 使用二.0必須語言一.一函數都取消 san-angeles NDK OpenGL ES 一.一常式序 二0一二-三-吧 San Angeles查維基網路虛構未概念城市位於南加州電影現源自Los AngelesSan Diego. 該程序演示效觀察宏偉城市面鏡面建築倒影城市飛船飛前5、陸觀察點且鏡每觀察點停移 例用NDK(C++)調用OpenGL ES 一.一繪制San Angeles城市基本全部使用NDKJava程序一 用vc二005演示目通跟蹤代碼解些細節: - jni所.h文件及demo.c,app-win三二.c復制放專門目錄改造用OpenGLES(或者乾脆刪除段繪制代碼保證編譯通) 首先析Java代碼 - DemoActivity.java唯Java文件主要需要列四jni介面: - private static native void nativeInit(); // 初始化 - private static native void nativeResize(int w, int h); - private static native void nativeRender(); // 繪制一幀 - private static native void nativeDone(); 其析C++代碼 app-android.c - 首先調用importGLInit()態導入OpenGL庫 - 其調用 appInit()內存建立平台關三D象集合建立用數組用類似畫圓拔高式產諸三角形 - 每鍾周期調用appRender()細節: - prepareFrame(width, height); // 准備OpenGL ES繪制框架其實清空顏色深度緩沖重置投影模型矩陣 - camTrack(); // 算前鍾周期鏡位置、朝向及焦距等調用gluLookAt實現 - configureLightAndMaterial(); // 設置光源材質 - drawModels(-一); // 先繪制倒影(其實所模型z軸倒畫) - 第循環畫精緻物體 - 第二循環畫運物體 - drawGroundPlane(); // 再繪制鏡般面繪制前取消光照打混合繪制繪制原狀態 - drawModels(一); // 再繪制所模型 - drawFadeQuad(); // 繪制淡框用融合式畫遮住整視口二D框融合系數間相
㈣ 如何學習一種開發框架
我接觸的許多程序員中,絕大多數都是知其然不知其所以然,做了AS好幾年的,甚至連AVM是什麼都不知道的太多了。許多程序員把快速開發出成品作為是工作的唯一目標,認為研究底層知識和周邊技術是浪費時間。很多東西他們不是不能知道,而是不想知道。
更有甚者,學會了 gotoAndPlay 就敢說熟悉 Flash,會敲 ls 就敢說精通Linux。前幾天有朋友發給我他膜拜了一日的逆天簡歷,上面洋洋灑灑寫著匯編、C/C++、Linux網路編程、JAVA EE、Perl、Bash、Python、Windows驅動開發、單片機開發、HTML、CSS3、JavaScript、PHP、cocos2d-x、iOS開發、安卓開發……而且所有的項目的級別都是 精通!
我看完簡歷和朋友說:這位前後端桌面嵌入式系統驅動網頁手機開發通吃的全棧神人10年裡跳槽8次,從沒在一個公司干滿過2年,你敢用么?
======上面廢話,不看也罷。
剛巧我也是從AS3轉到了cocos2d-x,說說我的經驗吧。
一、cocos2d-x 部分
1.1 技術選型
從第三個手游開始,我實在被Adobe的ANE和國內的小平台折騰得沒了脾氣,決定轉到cocos2d-x。在選擇哪種語言綁定的時候糾結了很久,最後力排眾議選了 lua:Cocos2dx+lua合適還是Cocos2dx+js合適? cocos2d-x 2.x 的lua綁定做得並不好,於是我選擇了 quick-cocos2d-x (後來,quick被觸控收購)。
1.2 學習 C++
C++ Primer 中文版(第 5 版) (豆瓣) 是不錯的入門書籍,建議看第五版,我寫過一篇 C++Primer 第4版和第5版比較 。學習期間建議畫一些思維導圖幫助理解和整理思路。例如這個(不完整):
1.3 學習DEMO和熟悉開發平台
編譯 cocos2d-x 自帶的 TestCPP 項目,全部跑一遍。熟悉 cocos2d-x API 的用法。記得用doxygen 生成文檔,建議每個API的功能都瀏覽一遍。
有的同學可能更喜歡直接看源碼,那當然更好。不過文檔有一個好處就是能更直觀地顯示繼承關系。
在學習DEMO的過程中,你必須熟悉自己開發平台的IDE,例如Windows上必須熟悉 Visual Studio,而OS X上必須熟悉xcode,Linux平台上就熟悉Eclipse+CDT吧。
注意,quick-cocos2d-x 是不支持Linux開發平台的。
2014-05-17更新:quick已經使用QT重寫了player部分,但依然不支持Liunx平台。
1.4 了解引擎的文件夾結構
基於 cocos2d-x 源碼生成的文檔並不怎麼詳細,許多功能必須看源碼。但這個階段,我不建議糾結源碼太深,倒是可以糾結一下 cocos2d-x 的文件夾結構,看看各個類放在什麼地方,找一找常見的哪些宏和常量以及枚舉定義在什麼地方,這花不了多少時間,但能讓你對cocos2d-x有更深刻的了解,同時給你很強的成就感。這種成就感沖淡了你面對大量源碼時候的無力感,讓你能夠繼續前行。
下面是我的分析:
1.5 重復上面的第3步:再次學習DEMO
這時候看DEMO可能會輕松不少,但是你會有更多的問題去糾結。例如多解析度支持?例如坐標系統?例如繪圖功能?例如層級管理系統?例如事件傳遞系統?等等等等……這時候可以去Google(注意不要用百毒和其他搜索引擎)找文檔看了。我推薦一些我看過的不錯的文檔和博客:
http://www.ityran.com/archives/4809
Cocos2d-x官方中文文檔 v2.x
Cocos2D | iOS Development Tips & Tricks by BiOM
子龍山人 - 博客園
紅孩兒的游戲編程之路
Ray Wenderlich
Cocos2d-x | Cross Platform Open Source 2D Game Engine
許多博客都是極好的。紅孩兒(後來加入了觸控)寫了許多源碼分析,每一句源碼都加了注釋。雖然我不太認同他這種吃力不討好的方法,但對於新手來說確實是有很大的幫助。
另外在 Stack Overflow 你能找到絕大部分問題的答案。當然,許多問題是針對 cocos2d 而非 cocos2d-x 的,不過用法相同,照看不誤。許多優秀的文章都是基於 cocos2d 的,所以,不要介意,可以先花半天時間熟悉 OC 的語法,能看懂即可。
暫時不要買中文書。我曾經花3天時間看完了 《Cocos2D-X游戲開發技術精解》 和 《cocos2d-x手機游戲開發–跨iOS、Android和沃Phone平台》,發現作者其實就是來賺稿費的。
忘了廣告了,我的博客(cocos2d-x | zrong's Blog)也有一些cocos2d-x內容,歡迎來噴。
1.6. 熟悉工具集
現在你應該對周邊工具感興趣了。例如幀動畫使用什麼製作?BMFont使用什麼製作?骨骼動畫呢?plist文件怎麼編輯?碎圖用什麼工具拼合?有些項目上,你有許多選擇,也可能沒得選。去Google吧,如果遇到選擇上的問題,歡迎找我討論。
二、 quick-cocos2d-x 部分
2.1 現在就到lua時間了
請認真讀完 《Lua程序設計(第2版) 》 第一、二、三部分。第四部分可暫時不讀。
1.2 熟悉 quick-cocos2d-x 的文件夾結構
相信有了上面 cocos2d-x 的基礎,這個應該不難理解。
1.3 跑完 quick-cocos2d-x 自帶的所有sample
在這期間,熟悉 framework 中的所有封裝。可以參考 quick網站 和 quick wiki 。
1.4 學習導出API給Lua使用
導出 C/C++ API 給 Lua 使用
三、學習 OpenGL ES
熟悉Lua部分之後,作為一個有志於成為程序員的碼農,依然要回到C/C++來,這里才是 cocos2d-x 的本質。
cocos2d-x 使用 OpenGL ES 進行渲染的,如果要對 cocos2d-x 的渲染層進行任何形式的擴展,你完全避不開 OpenGL ES。
既然逃不開,那就對TA說,請張開雙腿,我要上。
3.1 閱讀 OpenGL ES 2.0 Programming Guide
下面是這本書的官網,目前已經出了 OpenGL ES 3.0 版本,cocos2d-x 使用的是2.0。
http://www.opengles-book.com/es2/index.html
這本書寫得淺顯易懂,非常適合新手。有位網友花3個月時間翻譯了中文版,但還是建議你不要看了。
這里是 OpenGL ES 的 官方文檔 和 API中文翻譯 。
當然,你也可以買那本著名的 OpenGL 紅寶書 《OpenGL編程指南(原書第7版)》 來看,不過 OpenGL ES 相對與 OpenGL 來說還是有一些不同的,你要知道如何區分這些不同。
3.2 嘗試理解 cocos2d-x 的渲染部分架構
相關的類我就不列出了,我正在醞釀一個這方面的系列文章准備發到博客上。如果寫完了,我會在這里更新。
3.3 自己寫一些濾鏡、繪圖功能的擴展
例如這個: cocos2d-x-filters
四、回歸項目
到了這里,你可以開始你的項目了。雖然源碼還沒有讀完,但相信整個架構都能理解了。在做項目的過程中,再去一點點讀源碼是比較快捷和我能夠接受的方法,否則就太枯燥了。
你可以還需要選擇一下cocos2d-x相關的工具。你可能聽說過 CCB(cocosBuilder)和CCS(cocoStudio),嘗試了解她們,再決定是否使用她們。
你已經有了AS3的基礎,這樣許多前端的概念和經驗已經很豐富了。這些經驗在cocos2d-x中同樣適用。但是要注意的是,cocos2d-x不是AS3,不要試圖用AS3的方法去使用cocos2d-x。
有位碼農在從C#轉到AS3的時候向我抱怨:為什麼Flash Builder沒有Visual Studio的這個功能那個功能?
然後這位碼農在從AS3轉到Sublime Text(用於Lua編輯)的時候向我抱怨,為什麼Sublime Text沒有Flash Builder的這個功能那個功能?
上面是個笑話。
同時,為了解決一些cocos2d-x沒有提供的功能,你必須去學習相關的知識。例如這個:在 cocos2d-x 中使用 libcurl 實現上傳文件功能(附quick-cocos2d-x封裝)。不過你現在已經有了基礎,學習這些不是難事。
在有時間的時候,可認真讀一下上面提到的《Lua程序設計(第2版) 》第四部分,了解Lua和C語言通信的方式,順便看看cocos2d-x裡面是怎麼實現的。
另外,一些你需要的引擎中沒有的功能,也可以順手實現了開源出來(例如這個:一個LuaSocket封裝),說不定你需要的東西正好是別人也需要的。
五、熟悉發布平台
既然是做手游,Android和iOS平台是逃不掉了。
你要熟悉Android和iOS平台的特點,熟悉JAVA在Android上的應用,熟悉Objective-C在iOS上的應用,熟悉Eclipse ADT和XCode(上面應該已經熟悉過了)。
你還要熟悉Google Play和AppStore的發布流程以及方針、政策,內購的接入、SDK的嵌入。
你要學習和各個接入平台的程序員、商務、前台小妹打交道(因為經常會找不到你要找的真正的負責該SDK的技術人員),你要能忍受國內小平台糟糕的文檔、代碼規范和逆天的編程方法。
終、沒有終點
上面說的並不完整,應該遺漏了不少東西,但我只能說這么多了。因為我的經驗也止於此。
祝你成功!
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦
㈤ opengl 4.3 和 OPENGL ES 3.0差別大么,我有OPENGL 4.3的基礎可以不修改地用於OPENGLES3.0 的編程么謝謝
要改,改動不大
㈥ opengles shader 可以用for嗎
Shader可以說是現代OpenGL的靈魂。
這牽涉到一個歷史遺留問題:GL 1.x中只有固定管線,渲染效果是固定的,而在GL
2.0中增加了可編程管線,想要什麼渲染效果都可以自己往加。GL
3.0+就廢棄了固定管線,也就是說不寫Shader是不推薦的。不寫Shader的固定管線時代早就在十多年前過去了。
回到GLES中,GLES 1.0是固定管線(為了某些原因),不需要也不能寫Shader;GLES 2.0+是可編程管線,必須寫Shader。
建議題主少走點彎路,直接上可編程管線。雖然比固定管線稍微要多做點工作,但長遠來看是好的,能做出更炫的效果並充分利用GPU。
退固定管線保平安。
㈦ 如何在Android上使用OpenGL ES 2.0繪制點
OpenGLES是一個讓人崩潰的東西。在Andorid手機上做3D還就得用它。把我記的一些筆記分享在這里吧:AndroidOpenGLES簡介20011-6-3Android系統使用OpenGL的標准介面來支持3D圖形功能,android3D圖形系統也分為java框架和本地代碼兩部分。本地代碼主要實現的OpenGL介面的庫,在Java框架層,javax.microedition.khronos.opengles是java標準的OpenGL包,android.opengl包提供了OpenGL系統和AndroidGUI系統之間的聯系。Android的本地代碼位於frameworks/base/opengl下,JNI代碼位於frameworks/base/core/com_google_android_gles_jni_GLImpl.cpp和frameworks/base/core/com_google_android_gles_jni_EGLImpl.cpp,java類位於opengl/java/javax/microedition/khronos下本地測試代碼位於frameworks/base/opengl/tests。包括angeles、fillrate等14個測試代碼,這些代碼都可以通過終端進行本地調用測試(模擬器中使用adbshell)。OpenGLES1.x固定管線操作,支持glVertexPointer()等函數,不支持GLSL。頭文件在ndk的GLES目錄下,庫文件是libGLESv1_CM.so。OpenGLES2.x可編程管線操作,不兼容1.x,不支持固定管線操作,例如glVertexPointer()等函數。支持GLSL(還必須用這個來編程)。頭文件在ndk的GLES2目錄下,庫文件是libGLESv2.so。OpenGLES學習2011-6-30OpenGL定義了自己的數據類型。應該堅持使用這些OpenGL的數據類型,從而保證可移植性和效率。OpenGLES目前不支持64位數據類型。OpenGLES只支持三邊形。OpenGLES只支持gl開頭的函數,glu庫都不支持。OpenGLES從OpenGL中刪除的功能:1.glBegin/glEnd2.glArrayElement3.顯示列表4.求值器5.索引色模式6.自定義裁剪平面7.glRect8.圖像處理(這個一般顯卡也沒有,FireGL/Quadro顯卡有)9.反饋緩沖10.選擇緩沖11.累積緩沖12.邊界標志13.glPolygonMode14.GL_QUADS,GL_QUAD_STRIP,GL_POLYGON15.glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib16.TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP17.GL_COMBINE18.自動紋理坐標生成19.紋理邊界20.GL_CLAMP、GL_CLAMP_TO_BORDER21.消失紋理代表22.紋理LOD限定23.紋理偏好限定24.紋理自動壓縮、解壓縮25.glDrawPixels,glPixelTransfer,glPixelZoom26.glReadBuffer,glDrawBuffer,glCopyPixelsOpenGLES2.02011-10-92.0和1.1不兼容。-2.0使用的頭文件是ndk的include目錄下的GLES2目錄,有gl2.h,gl2ext.h,gl2platform.h,而1.1使用的是GLES目錄。-2.0使用的庫文件是ndk的lib目錄下的libGLESv2.so,而1.1使用的是libGLESv1_CM.so。-2.0中取消了很多1.1函數,例如glMatrixModel和glLoadIdentity等。OpenGL著色語言(GLSL――OpenGLShadingLanguage)-使用2.0,必須學此語言。因為很多1.1的函數都被取消了。san-angelesNDKOpenGLES1.1的例子程序2012-3-8SanAngeles,查維基網路,是一個虛構的未來概念城市,位於南加州。常在電影中出現,來源自LosAngeles和SanDiego.該程序的演示效果是,觀察一個宏偉的城市,地面是鏡面有建築倒影,城市中有飛船飛過。前後有5、6個觀察點,而且鏡頭在每個觀察點不停的移動。這個例子,用NDK(C++)調用OpenGLES1.1來繪制了SanAngeles這個城市。基本上全部使用了NDK,Java程序只有1個。用vc2005演示一下,目的通過跟蹤代碼了解一些細節。方法是:-將jni下所有的.h文件,以及demo.c,app-win32.c復制出來,放在一個專門的目錄下,然後改造成用OpenGL的而不是ES的。(或者乾脆刪除大段的繪制代碼,保證編譯通過)首先分析Java代碼-DemoActivity.java,這是唯一的Java文件,它主要需要下列4個jni的介面:-();//初始化-(intw,inth);-();//繪制1幀-();其次分析C++代碼app-android.c-首先,調用了importGLInit(),動態導入OpenGL的庫。-其次,調用了appInit(),在內存中建立了平台無關的3D對象集合。建立方法是用一個數組,用類似畫圓拔高的方式產生諸多三角形。-然後,在每個時鍾周期中調用appRender(),細節是:-prepareFrame(width,height);//准備OpenGLES繪制框架。其實就是清空顏色和深度緩沖,重置投影和模型矩陣。-camTrack();//算好在當前時鍾周期,鏡頭的位置、朝向及焦距等。然後調用gluLookAt來實現。-configureLightAndMaterial();//設置光源和材質-drawModels(-1);//先繪制倒影(其實就是將所有模型z軸倒過來畫)-第一個循環,是畫精緻的物體-第二個循環,是畫運動的物體-drawGroundPlane();//再繪制鏡子一般的地面。在繪制前取消光照,打開混合,然後繪制。繪制後還原狀態。-drawModels(1);//再繪制所有模型-drawFadeQuad();//最後繪制淡出框,用融合的方式畫一個遮住整個視口的2D框,融合系數和時間相關。
㈧ gl10用哪個編程軟體
OpenGL
OpenGL本身是開放圖形庫的一種標准,定義了一個跨語言、跨平台的編程規范,主要用於3D圖形編程。
GLSurfaceView主要用於顯示,GLSurfaceView.Render主要用於渲染,GL10類主要用於OpenGLES的具體操作,操作的流程相對繁瑣,需要對OpenGL本身有一定了解,因此建議先查看系列文章 專題分綱目錄 OpenGL教程。再來研究GL10部分代碼,相關文檔梳理如下:
GLSurfaceView 官方文檔:Android GLSurfaceView類 詳細解讀;
GLSurfaceView.Render 官方文檔:Android GLSurfaceView.Render類 詳細解讀;
GLSurfaceView的中用於操作OpenGLES的關鍵類為GL10,在代碼中使用最多,因此也做相關解讀,GLSurfaceView關鍵類GL10官方文檔:Android OpenGLES關鍵類GL10 詳細解讀。
㈨ android opengles2.0值得學習嗎
OpenGLES是一個讓人崩潰的東西。在Andorid手機上做3D還就得用它。把我記的一些筆記分享在這里吧:
Android OpenGL ES簡介 20011-6-3
Android系統使用OpenGL的標准介面來支持3D圖形功能,android 3D圖形系統也分為java框架和本地代碼兩部分。
本地代碼主要實現的OpenGL介面的庫,在Java框架層,javax.microedition.khronos.opengles是java標準的OpenGL包,
android.opengl包提供了OpenGL系統和Android GUI系統之間的聯系。
Android的本地代碼位於frameworks/base/opengl下,
JNI代碼位於frameworks/base/core/com_google_android_gles_jni_GLImpl.cpp和frameworks/base/core/com_google_android_gles_jni_EGLImpl.cpp,
java類位於opengl/java/javax/microedition/khronos下
本地測試代碼位於frameworks/base/opengl/tests。包括angeles、fillrate等14個測試代碼,這些代碼都可以通過終端進行本地調用測試(模擬器中使用adb shell)。
OpenGL ES 1.x
固定管線操作,支持glVertexPointer()等函數,不支持GLSL。頭文件在ndk的GLES目錄下,庫文件是libGLESv1_CM.so。
OpenGL ES 2.x
可編程管線操作,不兼容1.x,不支持固定管線操作,例如glVertexPointer()等函數。支持GLSL(還必須用這個來編程)。頭文件在ndk的GLES2目錄下,庫文件是libGLESv2.so。
OpenGL ES學習 2011-6-30
OpenGL定義了自己的數據類型。應該堅持使用這些OpenGL的數據類型,從而保證可移植性和效率。
OpenGL ES 目前不支持64位數據類型。
OpenGL ES 只支持三邊形。
OpenGL ES 只支持gl開頭的函數,glu庫都不支持。
OpenGL ES 從 OpenGL中刪除的功能:
1. glBegin/glEnd
2. glArrayElement
3. 顯示列表
4. 求值器
5. 索引色模式
6. 自定義裁剪平面
7. glRect
8. 圖像處理(這個一般顯卡也沒有,FireGL/Quadro顯卡有)
9. 反饋緩沖
10. 選擇緩沖
11. 累積緩沖
12. 邊界標志
13. glPolygonMode
14. GL_QUADS,GL_QUAD_STRIP,GL_POLYGON
15. glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib
16. TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP
17. GL_COMBINE
18. 自動紋理坐標生成
19. 紋理邊界
20. GL_CLAMP、GL_CLAMP_TO_BORDER
21. 消失紋理代表
22. 紋理LOD限定
23. 紋理偏好限定
24. 紋理自動壓縮、解壓縮
25. glDrawPixels,glPixelTransfer,glPixelZoom
26. glReadBuffer,glDrawBuffer,glCopyPixels
OpenGL ES 2.0 2011-10-9
2.0和1.1不兼容。
- 2.0使用的頭文件是ndk的include目錄下的GLES2目錄,有gl2.h,gl2ext.h,gl2platform.h,而1.1使用的是GLES目錄。
- 2.0使用的庫文件是ndk的lib目錄下的libGLESv2.so,而1.1使用的是libGLESv1_CM.so。
- 2.0中取消了很多1.1函數,例如glMatrixModel和glLoadIdentity等。
OpenGL著色語言(GLSL――OpenGL Shading Language)
- 使用2.0,必須學此語言。因為很多1.1的函數都被取消了。
san-angeles NDK OpenGL ES 1.1的例子程序 2012-3-8
San Angeles,查維基網路,是一個虛構的未來概念城市,位於南加州。常在電影中出現,來源自Los Angeles和San Diego.
該程序的演示效果是,觀察一個宏偉的城市,地面是鏡面有建築倒影,城市中有飛船飛過。前後有5、6個觀察點,而且鏡頭在每個觀察點不停的移動。
這個例子,用NDK(C++)調用OpenGL ES 1.1來繪制了San Angeles這個城市。基本上全部使用了NDK,Java程序只有1個。
用vc2005演示一下,目的通過跟蹤代碼了解一些細節。方法是:
- 將jni下所有的.h文件,以及demo.c,app-win32.c復制出來,放在一個專門的目錄下,然後改造成用OpenGL的而不是ES的。(或者乾脆刪除大段的繪制代碼,保證編譯通過)
首先分析Java代碼
- DemoActivity.java,這是唯一的Java文件,它主要需要下列4個jni的介面:
- private static native void nativeInit(); // 初始化
- private static native void nativeResize(int w, int h);
- private static native void nativeRender(); // 繪制1幀
- private static native void nativeDone();
其次分析C++代碼 app-android.c
- 首先,調用了importGLInit(),動態導入OpenGL的庫。
- 其次,調用了 appInit(),在內存中建立了平台無關的3D對象集合。建立方法是用一個數組,用類似畫圓拔高的方式產生諸多三角形。
- 然後,在每個時鍾周期中調用appRender(),細節是:
- prepareFrame(width, height); // 准備OpenGL ES繪制框架。其實就是清空顏色和深度緩沖,重置投影和模型矩陣。
- camTrack(); // 算好在當前時鍾周期,鏡頭的位置、朝向及焦距等。然後調用gluLookAt來實現。
- configureLightAndMaterial(); // 設置光源和材質
- drawModels(-1); // 先繪制倒影(其實就是將所有模型z軸倒過來畫)
- 第一個循環,是畫精緻的物體
- 第二個循環,是畫運動的物體
- drawGroundPlane(); // 再繪制鏡子一般的地面。在繪制前取消光照,打開混合,然後繪制。繪制後還原狀態。
- drawModels(1); // 再繪制所有模型
- drawFadeQuad(); // 最後繪制淡出框,用融合的方式畫一個遮住整個視口的2D框,融合系數和時間相關。
