導航:首頁 > 操作系統 > androidopenglegl

androidopenglegl

發布時間:2023-06-17 00:26:49

A. 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框,融合系數和時間相關。

B. 如何查看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存根類。

C. 為什麼使用 android opengl

准備 為了開始本次的教程,你必須具備: 1.一款支持Android開發的IDE,如果你沒有的話,可以在Android Developer website下載最新版本的Android studio。 2.一款運行Android4.0之上Android手機,並且GPU支持OpenGL ES2.0 3.對OpenGL的基本知識了解 設置OpenGL ES環境 創建GLSurfaceView 為了顯示OpenGL的圖形,你需要使用GLSurfaceView類,就像其他任何的View子類意義,你可以將它添加到你的Activity或Fragment之上,通過在布局xml文件中定義或者在代碼中創建實例。 在本次的教程中,我們使用GLSurfaceView作為唯一的View在我們的Activity中,因此,為了簡便,我們在代碼中創建 GLSurfaceView的實例並將其傳入setContentView中,這樣它將會填充你的整個手機屏幕。Activity中的onCreate方 法如下: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView view = new GLSurfaceView(this); setContentView(view); }123456123456 因為媒體效果的框架僅僅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中傳入2; view.setEGLContextClientVersion(2);11 為了確保GLSurfaceView僅僅在必要的時候進行渲染,我們在setRenderMode 方法中進行設置: view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);11 創建Renderer Renderer負責渲染GLSurfaceView中的內容。 創建類實現介面GLSurfaceView.Renderer,在這里我們打算將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下: 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) { } } 回到Activity中調用setRenderer方法,讓GLSurfaceView使用我們創建的Renderer: view.setRenderer(new EffectsRenderer(this));11 編寫Manifest文件 如果你想要發布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句: <uses-feature android:glEsVersion="0x00020000" android:required="true" />11 這會確保你的app只能被安裝在支持OpenGL ES2.0的設備之上。現在OpenGL環境准備完畢。 創建一個OpenGL平面 定義頂點 GLSurfaceView是不能直接顯示一張照片的,照片首先應該被轉化為紋理,應用在OpenGL square之上。在本次教程中,我將創建一個2D平面,並且具有4個頂點。為了簡單,我將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。 public class Square { }123123 默認的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數組來代表這些頂點: private float vertices[] = { -1f, -1f, 1f, -1f, -1f, 1f, 1f, 1f, };123456123456

D. android opengl es與surfaceview什麼關系

1.SurfaceFlinger是一個服務,主要是負責合成各窗口的Surface,然後通過OpenGLES顯示到FrameBuffer上。 2.DisplayHardware是對顯示設備的抽象,包括FrameBuffer和Overlay。載入FrameBuffer和Overlay插件,並初始化OpenGLES: view plain mNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow->getDevice(); if (hw_get_mole(OVERLAY_HARDWARE_MODULE_ID, &mole) == 0) { overlay_control_open(mole, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context); 3.FramebufferNativeWindow 是framebuffer 的抽象,它負責載入libgralloc,並打開framebuffer設備。FramebufferNativeWindow並不直接使用 framebuffer,而是自己創建了兩個Buffer: queueBuffer負責顯示一個Buffer到屏幕上,它調用fb->post去顯示。 dequeueBuffer獲取一個空閑的Buffer,用來在後台繪制。 這兩個函數由eglSwapBuffers調過來,調到 view plain egl_window_surface_v2_t::swapBuffers: nativeWindow->queueBuffer(nativeWindow, buffer); nativeWindow->dequeueBuffer(nativeWindow, &buffer); 4.msm7k/liboverlay是Overlay的實現,與其它平台不同的是,高通平台上的Overlay並不是提供一個framebuffer設備,而通過fb0的ioctl來實現的,ioctl分為兩類操作: OverlayControlChannel用於設置參數,比如設置Overlay的位置,寬度和高度: view plain bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) { ov.dst_rect.x = x; ov.dst_rect.y = y; ov.dst_rect.w = w; ov.dst_rect.h = h; ioctl(mFD, MSMFB_OVERLAY_SET, &ov); } OverlayDataChannel用於顯示Overlay,其中最重要的函數就是queueBuffer: view plain bool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) } 5.msm7k/libgralloc 是顯示緩存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 裝,Surface的Buffer則是對/dev/pmem、ashmem和GPU內存(msm_hw3dm)的包裝,它的目標主要是方便硬體加速,因為 DMA傳輸使用物理地址,要求內存在物理地址上連續。 6.msm7k/libbit這是2D加速庫,主要負責Surface的拉伸、旋轉和合成等操作。它有兩種實現方式: bit.cpp: 基於fb0的ioctl(MSMFB_BLIT)的實現。 bit_c2d.cpp: 基於kgsl的實現,只是對libC2D2.so的包裝,libC2D2.so應該是不開源的。 7.pmem misc/pmem.c: 對物理內存的管理,演算法和用戶空間的介面。 board-msm7x27.c定義了物理內存的預設大小: view plain #define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C00 msm_msm7x2x_allocate_memory_regions分配幾大塊內存用於給pmem做二次分配。 8.KGSL Kernel Graphics System Layer (KGSL),3D圖形加速驅動程序,源代碼drivers/gpu/msm目錄下,它是對GPU的包裝,給OpenGLES 2.0提供抽象的介面。 9.msm_hw3dm 這個我在內核中沒有找到相關代碼。 10.msm_fb msm_fb.c: framebuffer, overlay和blit的用戶介面。 mdp_dma.c: 對具體顯示設備的包裝,提供兩種framebuffer更新的方式: mdp_refresh_screen: 定時更新。 mdp_dma_pan_update: 通過pan display主動更新。 mdp_dma_lcdc.c:針對LCD實現的顯示設備,mdp_lcdc_update用更新framebuffer。

E. 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進行繪制算是比較繁瑣的過程,後面也會慢慢去揭曉其他使用方法,來構造一幅一幅精美的特效靜/動圖。

F. 手機openGl是什麼意思

編程作圖

閱讀全文

與androidopenglegl相關的資料

熱點內容
程序員男友消失了 瀏覽:395
程序員搜索框自動提示 瀏覽:22
android44api20 瀏覽:675
adb刷recovery命令 瀏覽:695
廣聯達正版加密鎖可以補辦嗎 瀏覽:943
java程序員一天多少行代碼 瀏覽:946
喪屍危機java 瀏覽:123
華為手機怎麼去除app標記未讀信息 瀏覽:854
java監控文件夾 瀏覽:805
群控伺服器主機怎麼轉變普通電腦 瀏覽:707
手機怎麼調整app大小 瀏覽:455
加密門禁卡揭秘 瀏覽:138
詞釋pdf 瀏覽:992
安卓手機上如何停止自動續費 瀏覽:880
加密編碼摘要 瀏覽:786
疫情命令黨 瀏覽:497
java轉sql 瀏覽:706
android獲取apn 瀏覽:74
phpfpm進程池 瀏覽:795
解壓掏耳朵音頻 瀏覽:676