androidgl
⑴ android gles20和gl10的區別
public void onSurfaceChanged(GL10 gl, int width, int height) {
//設置視窗大盯寬小及位置
GLES20.glViewport(0, 0, width, height);
//計算GLSurfaceView的寬高比
float ratio = (float) width / height;
//調用此方法計算產生透視投影矩陣
MatrixState.setProjectFrustum(-ratio, ratio, -1, 1, 2, 100);
//調用此方法產生攝像機9參數位置矩陣
MatrixState.setCamera(0,0,0,0f,0f,-1f,0f,1.0f,0.0f);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//設置屏幕背景色RGBA
GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
//打開深度檢族則橘測
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
//打開背面剪裁
GLES20.glEnable(GLES20.GL_CULL_FACE);
//初始化變換矩陣
MatrixState.setInitStack();
//載入要繪制的物體
lovo=LoadUtil.loadFromFile("ch.obj"兆團, MySurfaceView.this.getResources(),MySurfaceView.this);
}
}
⑵ 如何使用Android中的OpenGL ES媒體效果
設置OpenGL ES環境
創建GLSurfaceView
為了顯示OpenGL的圖形,你需要使用GLSurfaceView類,就像其他任何的View子類意義,你可以將它添加到你的Activity或Fragment之上,通過在布姿唯局xml文件中定義或者在代碼中創建實例。
在本次的教程中,我們使用GLSurfaceView作為唯一的View在我們的Activity中,因此,為了簡便,我們在代碼中創建GLSurfaceView的實例並將其傳入setContentView中,這樣它將會填充你的整個手機屏幕。Activity中的onCreate方法如下:
<code class="hljs" java="">protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView view = new GLSurfaceView(this); setContentView(view);}</code>
因為媒體效果的框架僅僅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中傳入2;
<code avrasm="" class="hljs">view.setEGLContextClientVersion(2);</code>
為了確保GLSurfaceView僅僅在必要的時候進行渲染,我們在setRenderMode 方法中進行設置:
<code avrasm="" class="hljs">view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);</code>
創建Renderer
Renderer負責渲染GLSurfaceView中的內容。
創建類實現介面GLSurfaceView.Renderer,在這里我們打算將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下:
<code class="hljs" java="">public class EffectsRenderer implements GLSurfaceView.Renderer { public EffectsRenderer(Context context){ super(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { } @Override public void onDrawFrame(GL10 gl) { }}</code>
回到Activity中調用setRenderer方法,讓GLSurfaceView使用我們創建的Renderer:
<code class="hljs" cs="">view.setRenderer(new EffectsRenderer(this));</code>
編寫Manifest文件
如果你想要發布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句:
<code class="hljs" xml=""><uses-feature android:glesversion="0x00020000" android:required="true"></uses-feature></code>
這會確保你的app只能被安裝在支持OpenGL ES2.0的設備之上。現在OpenGL環境准備完畢。
創建一個OpenGL平面
定義頂點
GLSurfaceView是不能直接顯示一桐滑張照片的,照片首先應該被轉化為紋理,應用在OpenGL square之上。在本次教程中,我將創建一個2D平面,並且具有4個頂點。跡輪培為了簡單,我將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。
<code class="hljs" cs="">public class Square {}</code>
默認的OpenGL系統的坐標系中的原點是在中心,因此4個角的坐標可以表示為:
左下角: (-1, -1) 右下角:(1, -1) 右上角:(1, 1) 左上角:(-1, 1)
我們使用OpenGL繪制的所有的物體都應該是由三角形決定的,為了畫一個方形,我們需要兩個具有一條公共邊的三角形,那意味著這些三角形的坐標應該是:
triangle 1: (-1, -1), (1, -1), 和 (-1, 1) triangle 2: (1, -1), (-1, 1), 和 (1, 1)
創建一個float數組來代表這些頂點:
<code class="hljs" cpp="">private float vertices[] = { -1f, -1f, 1f, -1f, -1f, 1f, 1f, 1f,};</code>
為了在square上定位紋理,需要確定紋理的頂點坐標,創建另一個數組來表示紋理頂點的坐標:
<code class="hljs" cpp="">private float textureVertices[] = { 0f,1f, 1f,1f, 0f,0f, 1f,0f};</code>
創建緩沖區
這些坐標數組應該被轉變為緩沖字元(byte buffer)在OpenGL可以使用之前,接下來進行定義:
<code class="hljs" cs="">private FloatBuffer verticesBuffer;private FloatBuffer textureBuffer;</code>
在initializeBuffers方法中去初始化這些緩沖區:使用ByteBuffer.allocateDirect來創建緩沖區,因為float是4個位元組,那麼我們需要的byte數組的長度應該為float的4倍。
下面使用ByteBuffer.nativeOrder方法來定義在底層的本地平台上的byte的順序。使用asFloatBuffer方法將ByteBuffer轉化為FloatBuffer,在FloatBuffer被創建後,我們調用put方法來將float數組放入緩沖區,最後,調用position方法來保證我們是由緩沖區的開頭進行讀取。
<code avrasm="" class="hljs">private void initializeBuffers(){ ByteBuffer buff = ByteBuffer.allocateDirect(vertices.length * 4); buff.order(ByteOrder.nativeOrder()); verticesBuffer = buff.asFloatBuffer(); verticesBuffer.put(vertices); verticesBuffer.position(0); buff = ByteBuffer.allocateDirect(textureVertices.length * 4); buff.order(ByteOrder.nativeOrder()); textureBuffer = buff.asFloatBuffer(); textureBuffer.put(textureVertices); textureBuffer.position(0);}</code>
創建著色器
著色器只不過是簡單的運行在GPU中的每個單獨的頂點的C程序,在本次教程中,我們使用兩種著色器:頂點著色器和片段著色器。
頂點著色器的代碼:
<code class="hljs" glsl="">attribute vec4 aPosition; attribute vec2 aTexPosition; varying vec2 vTexPosition; void main() { gl_Position = aPosition; vTexPosition = aTexPosition; };</code>
片段著色器的代碼
<code class="hljs" glsl="">precision mediump float; uniform. sampler2D uTexture; varying vec2 vTexPosition; void main() { gl_FragColor = texture2D(uTexture, vTexPosition); };</code>
如果你了解OpenGL,那麼這段代碼對你來說是熟悉的,如果你不能理解這段代碼,你可以參考OpenGL documentation。
⑶ Android opengl es 2.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框,融合系數和時間相關。
⑷ android 中 glCompressedTexImage2D(GL_PALETTE8_RGBA8_OES)生成的壓縮紋理在顯存中是壓縮的嗎
是壓縮的。由於減少了帶寬佔用,對性能是有好處的。不過畫質是有損的。 你用的這個參數會出錯吧
⑸ Android OpenGL 的基本使用
由於本人現在在公司做Android上的OpenGL圖像處理相關功能,以前沒有搞過這方面的知識,所以一切只能從頭開始搞起,接下來將會慢慢分享其他方面的內容,先譽凳用這篇比較基礎的文章來開頭。
剛才我們談到圖像處理,在做圖像處理我們不是可以用Canvas來繪制嗎,怎麼還要用OpenGL那麼陌生的東西來搞?為什麼要用OpenGL,肯定有它的好處。
接下來我們會來講解如何在Android項目開發過程中加入OpenGL,在開始前我們先了解同OpenGL ES密切相關的載體:GLSurfaceView:
要用OpenGL繪制,首先要有GLSurfaceVie的實例
現在OpenGL ES版本已經到3.0了,Android平台上目前有1.0和2.0,我們使用的是2.0,在使用前在onCreate()方法中檢查是否支持2.0的版本並且確定使用2.0
一般我們只需要使用「configurationInfo.reqGlEsVersion >= 0x20000」,至於加後面主要是用於模擬器檢查,假定模擬器支持2.0。
前面說到GLSurfaceView挖了一個洞,就是為了看見下面的渲染表面,同樣實在onCreate()方法中
通過setEGLContextClientVersion()方法配置surface視圖,設定好使用的OpenGL版本,然後調用setRenderer()傳進有褲讓自定義Renderer類的新實例。當Surface創建或者發生變化的時候,以及繪制一幅新幀時,渲染器都會被GLSurfaceView調用。
GLSurfaceView的生命周期要協同好Activity的生命周期,避免造成內存泄漏。
Renderer類也就是我們的渲染類了,它是通過實現Renderer介面來實現功能的。
渲染器介面定義的方法:
實現Renderer的介面方法
首選在onSurfaceCreated()中調用glClearColor設置清空屏幕用的顏色,這里使用紅色。
設置視口的大小
在onDrawFrame()中調用glClear(GL_COLOR_BUFFER_BIT)清空屏幕,會調用glClearColor中定義的顏色來填充整個屏幕。通過這幾個步驟,基本上就可以在GLSurfaceView繪制出東西了,在這里我只是簡單的用紅色繪制整個屏幕。
OpenGL在Android上的使用基本上胡虛局是這樣,但是,當然沒那麼簡單,在使用OpenGL進行繪制算是比較繁瑣的過程,後面也會慢慢去揭曉其他使用方法,來構造一幅一幅精美的特效靜/動圖。
⑹ android 中OpenGL的glBindTexture方法,第二個參數 紋理名稱是什麼意思
我也是菜鳥啊 ,我的設計還沒開始呢 ,下面這段話希望能對你有幫助,網上一個教程上看到的 前面已經提到過,載入一幅紋理所需要的時間是比較多的。因此應該盡量減少載入紋理的次數。如果只有一幅紋理,則應該在第一次繪制前就載入它,以後就不需要再次載入了。這點與glDrawPixels函數很不相同。每次使用glDrawPixels函數,都需要把像素數據重新載入一次,因此用 glDrawPixels函數來反復繪制圖象的效率是較低的(如果只繪制一次,則不會有此問題),使用紋理來反復繪制圖象是可取的做法。 但是,在每次繪制時要使用兩幅或更多幅的紋理時,這個辦法就行不通了。你可能會編寫下面的代碼: glTexImage2D( /* ... */ ); // 載入第一幅紋理 // 使用第一幅紋理 glTexImage2D( /* ... */ ); // 載入第二幅紋理 // 使用第二幅紋理 // 當紋理的數量增加時,這段代碼會變得更加復雜。 在繪制動畫時,由於每秒鍾需要將畫面繪制數十次,因此如果使用上面的代碼,就會反復載入紋理,這對計算機是非常大的負擔,以目前的個人計算機配置來說,根本就無法讓動畫能夠流暢的運行。因此,需要有一種機制,能夠在不同的紋理之間進行快速的切換。 紋理對象正是這樣一種機制。我們可以把每一幅紋理(包括紋理的像素數據、紋理大小等信息,也包括了前面所講的紋理參數)放到一個紋理對象中,通過創建多個紋理對象來達到同時保存多幅紋理的目的。這樣一來,在第一次使用紋理前,把所有的紋理都載入,然後在繪制時只需要指明究竟使用哪一個紋理對象就可以了。 使用紋理對象和使用顯示列表有相似之處:使用一個正整數來作為紋理對象的編號。在使用前,可以調用glGenTextures來分配紋理對象。該函數有兩種比較常見的用法: GLuint texture_ID; glGenTextures(1, &texture_ID); // 分配一個紋理對象的編號 或者: GLuint texture_ID_list[5]; glGenTextures(5, texture_ID_list); // 分配5個紋理對象的編號 零是一個特殊的紋理對象編號,表示「默認的紋理對象」,在分配正確的情況下,glGenTextures不會分配這個編號。與glGenTextures對應的是glDeleteTextures,用於銷毀一個紋理對象。 在分配了紋理對象編號後,使用glBindTexture函數來指定「當前所使用的紋理對象」。然後就可以使用glTexImage*系列函數來指定紋理像素、使用glTexParameter*系列函數來指定紋理參數、使用glTexCoord*系列函數來指定紋理坐標了。如果不使用 glBindTexture函數,那麼glTexImage*、glTexParameter*、glTexCoord*系列函數默認在一個編號為0的紋理對象上進行操作。glBindTexture函數有兩個參數,第一個參數是需要使用紋理的目標,因為我們現在只學習二維紋理,所以指定為 GL_TEXTURE_2D,第二個參數是所使用的紋理的編號。 使用多個紋理對象,就可以使OpenGL同時保存多個紋理。在使用時只需要調用glBindTexture函數,在不同紋理之間進行切換,而不需要反復載入紋理,因此動畫的繪制速度會有非常明顯的提升。典型的代碼如下所示: // 在程序開始時:分配好紋理編號,並載入紋理 glGenTextures( /* ... */ ); glBindTexture(GL_TEXTURE_2D, texture_ID_1); // 載入第一幅紋理 glBindTexture(GL_TEXTURE_2D, texture_ID_2); // 載入第二幅紋理 // 在繪制時,切換並使用紋理,不需要再進行載入 glBindTexture(GL_TEXTURE_2D, texture_ID_1); // 指定第一幅紋理 // 使用第一幅紋理 glBindTexture(GL_TEXTURE_2D, texture_ID_2); // 指定第二幅紋理 // 使用第二幅紋理 提示:紋理對象是從OpenGL 1.1版開始才有的,最舊版本的OpenGL 1.0並沒有處理紋理對象的功能。不過,我想各位的機器不會是比OpenGL 1.1更低的版本(Windows 95就自帶了OpenGL 1.1版本,遺憾的是,Microsoft對OpenGL的支持並不積極,Windows XP也還採用1.1版本。據說Vista使用的是OpenGL 1.4版。當然了,如果安裝顯卡驅動的話,現在的主流顯卡一般都附帶了適用於該顯卡的OpenGL 1.4版或更高版本),所以這個問題也就不算是問題了。
⑺ android GLSurfacsView 畫2D
GLSurfacsView沒有對應2D中canvas.drawRect(x,y,w,h,p)這么簡單李含的方法,使用的是和2D繪圖完全不同的理論體系,GLSurfacsView中的圖形是通過opengl畫出來的,圖元只有點、線、三角形,羨胡使用的是三維坐標數組,要想畫出2D式樣的圖形,把Z軸的坐標置為0即可;
除此之外糾正一下,surfaceView跟canvas畫圖沒什麼兄擾攔關系,surfaceView是播放視頻流媒體的。
⑻ 如何查看android系統的openGL版本
android中查看手機系統的OpenGL版本,可以使用如下代碼進行查詢:
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存根類。
⑼ 安卓中經常出現的GL前綴或後綴是什麼含義
計算機第三代語言,增強性的高級程序設計語言或圖形程序庫。