標籤:
簡介OpenGL
OpenGL的全稱是Open Graphics Library,即開放的圖形庫介面,它定義了一個跨程式設計語言,跨平台的編程介面的規範,它主要用於3D圖形(2D也可以)編程。OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS RL是一個工業標準的3D圖形軟體介面,功能雖然強大,但是移植性不好,於是SGI公司在IRIS GL的基礎上開發了OpenGL。
OpenGL體系簡單,而且具有跨平台特性,它不像Direct3D,是Microsoft開發的windows平台下的圖形介面,只能在windows系統上運行。因此OpenGL具有很廣泛的適應性,不僅用於大型工作站,也用於個人PC。
OpenGL ES
在圖形工作站,個人PC上,OpenGL都可以很好的工作。但三維圖形計算需要處理大量資料,因此在一些手機之類小型裝置上,如果繼續用OpenGL,就顯得比較困難。為瞭解決這個問題,Khronos集團問OpenGL提供了一個子集:OpenGL ES(OpenGL for Embedded System,即為嵌入式系統最佳化的OpenGL)。
Khronos是一個圖形軟硬體行業協會,該協會主要關注圖形和多媒體方面的開放標準,Khronos協會針對手機,PDA(個人資料助手)和遊戲主機等嵌入式裝置設定了OpenGL ES。
OpenGL ES是免費的、跨平台的、功能完備的2D/3D圖形庫介面API,它針對多種嵌入式系統(包括控制台,手機,手持功能,家電,汽車)專門設計,他是一個精心提取的OpenGL子集。
OpenGL ES剔除了OpenGL中的glBegin/glEnd,四邊形(GL_QUADS)、多邊形(GL_POLYGONS)等許多非絕對必要的特性。經過多年發展,目前OpenGL ES主要有兩個版本,OpenGL ES 1.x針對固定管線硬體;OpenGL ES 2.x針對可程式化管線硬體。
OpenGL ES 1.0是以OpenGL 1.3規範為基礎的,OpenGL ES 1.1是以OpenGL ES 1.5規範為基礎的,分別支援common和common lite兩種profile。lite profile只支援定點實數,而common profile及支援定點數又支援浮點數。
目前Android SDK已經支援OpenGL ES 2.0絕大多數功能,封裝在android.opengl包裡。
繪製2D圖形
android中OpenGL ES提供了GLSurfaceView組件,用於顯示3D圖形。GLSurfaceView本身布提供3D繪圖功能,而是由GLSurfaceView.Renderer來進行SurfaceView中的3D圖形繪製。
OpenGL ES使用步驟:
1、建立GLSurfaceView組件,使用Activity來顯示GLSurfaceView組件。
2、為GLSurfaceView組件建立GLSurfaceView.Renderer執行個體,實現它時,需要重寫該介面的三個方法:
- abstract void onDrawFrame(GL10 gl):Renderer對象調用該方法繪製GLSurfaceView的當前幀。
- abstract void onSurfaceChanged(GL10 gl,int width,int height):當前GLSurfaceView的大小改變時,回調該方法。
- abstract void onSurfaceCreated(GL10 gl,EGLConfig config):當GLSurfaceView被建立時回調該方法
3、調用GLSurfaceView組件的setRenderer()方法,指定Renderer對象,該Renderer對象將會完成GLSurfaceView裡的3D圖形繪製。
所以,繪製3D圖形的痛點,不是如何使用GLSurface組件,而是實現Renderer類。實現Renderer類時的三個方法(如上)中的GL10形參,為GLOpen ES的“畫筆”,類似重寫View時,onDraw()方法裡的Canvas組件。
當SurfaceView被建立時,回調Renderer對象的onSurfaceCreated()方法,該方法裡執行一些無需任何改變的初始化。如下:
@Overridepublic void onSurfaceCreated(GL10 gl,EGLConfig config){//關閉抗抖動gl.dlDisable(GL10.GL_DITHER);//設定系統對透視進行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);gl.glClearColor(0,0,0,0);//設定陰影平滑模式gl.glShadeModel(GL10.GL_SMOOTH);//啟用深度測試gl.glEnable(GL10.GL_DEPTH_TEXT);//設定深度測試類型gl.glDepthFunc(GL10.GL_LEQUAL);}
[android] OpenGL與OpenGL ES簡介