androidopengl圖片
『壹』 android openGL es圖形旋轉問題
在android中,要實現動畫效果,要麼通過循環調用canvas.draw系統方法,要麼通過調用opengl es中的GLSurfaceView.Renderer實現方法onDrawFrame方法。 這個方法大體的原理是開起一個線程,在此線程內不斷的調用onDrawFrame,實現效果。
其中gl.glRotatef(angle, x, y, z)的angle是旋過多少度。
『貳』 android opengl製作地圖 繪制圖片的問題
是要自己開發地圖引擎,還是需要用地圖引擎類似的功能啊。。。如果是後者那麼android的Google Map API 就是基於OpenGL ES 的,如果是想自己開發地圖引擎,既然Google做了,所以說是可行的,至於感覺如何只有自己做過了才知道啊
『叄』 怎麼把android OpenGL ES 繪制的圖像背景變為透明
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 OpenGL ES(四)-為平面圖添加濾鏡
上一章載入圖片的過程,在這里就不做贅述。
之前我們通過YUV數據格式的處理知道,只要保留Y的數據,就是灰度的圖片。但是OpenGL中處理的是RGB格式的數據,我們要如何去取得灰度圖呢?
我們可以通過公式,計算出新的RGB值,就是灰度的圖片了。
我們的目標已經確定。下面我們需要將片段著色器上的每個像素的RGB值,通過上面的公式計算,裝換成我們的灰度值。
根據上面的思路,我們需要去改片元著色器。 texture_fragment_shader.glsl
對比之前的,需要是有如下的修改點:
按照之前的想法,我們需要將我們的公式中的系數傳遞進入,就可以完成我們的操作了。基於之前的認識,我們知道傳遞我們的屬性 uniform 給OpenGL的都是通過創建數組,綁定屬性,這一套流程。
與上面的黑白色的處理相似,冷色調的處理就是單一增加藍色通道的值,暖色調的處理可以增加紅綠通道的值。
不管是冷色還是暖色。每個像素的顏色都和我們傳入的色值相加,產生偏置之後的顏色。同時還要確保顏色的值合法。如果超過最大,或者小於最小,就用極限值表示。
還是之前的套路。
紅黃通道增加的結果
藍色通道增加的結果
圖片模糊處理相對上面的色調處理稍微復雜一點,通常圖片模糊處理是採集周邊多個點,
然後利用這些點的色彩和這個點自身的色彩進行計算,得到一個新的色彩值作為目標色彩。
模糊處理有很多演算法,類似高斯模糊、徑向模糊等等。
最常用的還是高斯模糊。先看一下高斯模糊的原理。
使用正態分布作為權重分配模式,對周圍像素取平均值的方式,就是高斯模糊。
在圖形上,正態分布是一種鍾形曲線,越接近中心,取值越大,越遠離中心,取值越小。
計算平均值的時候,我們只需要將"中心點"作為原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。
上面的正態分布是一維的,圖像都是二維的,所以我們需要二維的正態分布。
二維高斯函數:
有了這個函數 ,就可以計算每個點的權重了。
為了計算權重矩陣,需要設定σ的值。假定σ=1.5,則 模糊半徑為1 的權重矩陣,權重之和等於1,得到最終的權重矩陣。
對所有點重復這個過程,就得到了高斯模糊後的圖像。如果原圖是彩色圖片,可以對RGB三個通道分別做高斯模糊。
如果一個點處於邊界,周邊沒有足夠的點,怎麼辦?
一個變通方法,就是把已有的點拷貝到另一面的對應位置,模擬出完整的矩陣。
上面著色器。我們是計算好了卷積核,直接在 shader 內寫死應用的。
這一小節的內容耗時比較長。其實就是利用OpenGL的shader對圖像進行簡單的濾鏡處理。
從這節我們學習到
下一章,會回到Android的內容。將OpenGl和Camera結合在一起。通過OpenGl來顯示一個預覽的畫面。
『伍』 android OpenGl ES 的問題 我給一個模型貼紋理 在我手機上運行的時候 圖片只能選取256*256像素的
最簡單直接的方法就是把你的圖片丟到 drawble文件夾中(如果沒有,建一個),不要放在drawable-hdpi,drawable-mdpi,或drawable-ldpi文件夾中即可
『陸』 android 用png圖像做opengl紋理時出現黑邊怎麼解決
誒呀,你這種用法大錯特錯了呀!texImage2D不能亂用呀,他是把資源導入GL用的,有點像玩游戲時的Loading.你應該在你的程序初始化時先glGentexture生成多個紋理句柄然後BindTexture,再把你需要的圖片依次輸入這時GL已經擁有了你全部的圖片資源,然後在繪制的時候,用到哪張紋理就先Bind這個紋理,然後DrawArray,再Bind再DrawArray/DrawElement..哪有你這樣每次draw都要texImage2D的?這不要慢死了推薦你去powervr的網站下載Opengles的pc端SDK,裡面好多demo
『柒』 如何使用Android中的OpenGL ES媒體效果
准備
一款支持Android開發的IDE;
一款運行Android4.0之上Android手機,並且GPU支持OpenGL
ES2.0
;
對OpenGL的基本知識了解;
步驟
設置OpenGL
ES環境
為了顯示OpenGL的圖形,需要使用GLSurfaceView類,就像其他任何的View子類意義,可以將它添加到Activity或Fragment之上,通過在布局xml文件中定義或者在代碼中創建實例,Activity中的onCreate方法如下:
因為媒體效果的框架僅僅支持OpenGL
ES2.0及以上的版本,所以在setEGLContextClientVersion
方法中傳入2;
了確保GLSurfaceView僅僅在必要的時候進行渲染,在setRenderMode
方法中進行設置:
創建Renderer
創建類實現介面GLSurfaceView.Renderer,將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下:
回到Activity中調用setRenderer方法,讓GLSurfaceView使用我們創建的Renderer:
編寫Manifest文件
在AndroidManifest.xml文件中添加如下語句:
創建一個OpenGL平面
創建一個2D平面,並且具有4個頂點。
默認的OpenGL系統的坐標系中的原點是在中心,因此4個角的坐標可以表示為:
創建一個float數組來代表這些頂點,在square上定位紋理,需要確定紋理的頂點坐標,創建另一個數組來表示紋理頂點的坐標:
這些坐標數組應該被轉變為緩沖字元(byte
buffer)在OpenGL可以使用之前,所以需要定義:
『捌』 如何使用Android中的OpenGL ES媒體效果
Android的媒體效果框架允許開發者可以很容易的應用多種令人印象深刻的視覺效果到照片或視頻之上。作為這個媒體效果的框架,它使用GPU來處
理圖片處理的過程,它僅僅接收OpenGL的紋理(texture)作為輸入。在本次教程中,你將會學習到如何使用OpenGL
ES2.0將圖片資源轉化為紋理,以及如何使用框架為圖片應用不同的處理效果。
准備
為了開始本次的教程,你必須具備:
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);
}
因為媒體效果的框架僅僅支持OpenGL ES2.0及以上的版本,所以在setEGLContextClientVersion 方法中傳入2;
view.setEGLContextClientVersion(2);
為了確保GLSurfaceView僅僅在必要的時候進行渲染,我們在setRenderMode 方法中進行設置:
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
創建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));
編寫Manifest文件
如果你想要發布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句:
這會確保你的app只能被安裝在支持OpenGL ES2.0的設備之上。現在OpenGL環境准備完畢。
創建一個OpenGL平面
定義頂點
GLSurfaceView是不能直接顯示一張照片的,照片首先應該被轉化為紋理,應用在OpenGL square之上。在本次教程中,我將創建一個2D平面,並且具有4個頂點。為了簡單,我將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。
public class Square {
}
默認的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,
};
為了在square上定位紋理,需要確定紋理的頂點坐標,創建另一個數組來表示紋理頂點的坐標:private float textureVertices[] = {
0f,1f,
1f,1f,
0f,0f,
1f,0f
};
『玖』 android 用png圖像做opengl紋理時出現黑邊怎麼解決
用libpng把png圖片讀出來就可以用讀出的數據生成文理了.
『拾』 android 使用opengl es2.0瀏覽全景圖片
先上效果圖
我是android opengl es的初學者,有很多東西還不懂,仍在學習;這里實現全景圖瀏覽的一個思路是,先使用opengl繪制一個球體,這個球體中心位置在手機屏幕的中心,球體的半徑為3。默認攝像機的位置在球體正前方半徑為3的位置上,看著球體的中心,在收觸摸屏幕的時候,不斷調整攝像機的位置,但是保持距離球體中心的位置不變。
球體繪製成功後,將准備好的全景圖,貼在球體的表面,就完成了(不需要對全景圖進行特殊處理,我剛開始的思路是繪制一個正方體天空盒,然後對全景圖進行處理,獲得天空盒六個面的圖像,然後將圖像貼在六個面上,結果發現我不會。。。。)。
這里涉及到
opengl的繪制,可以看看 android opengl es2.0完全入門這篇文章
繪制球體,opengl es2.0隻能繪制點,線和三角形,如果要繪制球體的話,需要將球體表面切分成成千上萬個小矩形,矩形又可以切分成三角形來繪制,只要切分的夠細,看上去就是球體。
繪制球體需要你掌握一點三維空間和三角函數的知識