當前位置:首頁 » 安卓系統 » androidopengl貼圖

androidopengl貼圖

發布時間: 2022-10-23 04:44:02

A. 如何使用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。

B. android opengl es給多個矩形上紋理

誒呀,你這種用法大錯特錯了呀!
texImage2D 不能亂用呀 , 他是把資源導入GL用的,有點像玩游戲時的Loading.你應該在你的程序初始化時

先glGentexture 生成多個紋理句柄...然後BindTexture ,再把你需要的圖片依次輸入...這時GL已經擁有了你全部的圖片資源 ,然後在繪制的時候,
用到哪張紋理 就先Bind 這個紋理,然後DrawArray ,再Bind 再DrawArray/DrawElement..
哪有你這樣每次draw 都要texImage2D 的? 這不要慢死了...

推薦你去power vr的網站下載Opengles的pc端 SDK ,裡面好多demo

C. 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來顯示一個預覽的畫面。

D. 為什麼使用 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

E. android opengl es中,我畫好了一個立方體,在oncreate中貼好了紋理,在後面我想更換紋理,怎麼做啊

新建一個紋理,在繪制的時候使用新的紋理就可以了

F. 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版或更高版本),所以這個問題也就不算是問題了。

G. 如何使用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
};

H. android 用png圖像做opengl紋理時出現黑邊怎麼解決

誒呀,你這種用法大錯特錯了呀!texImage2D不能亂用呀,他是把資源導入GL用的,有點像玩游戲時的Loading.你應該在你的程序初始化時先glGentexture生成多個紋理句柄然後BindTexture,再把你需要的圖片依次輸入這時GL已經擁有了你全部的圖片資源,然後在繪制的時候,用到哪張紋理就先Bind這個紋理,然後DrawArray,再Bind再DrawArray/DrawElement..哪有你這樣每次draw都要texImage2D的?這不要慢死了推薦你去powervr的網站下載Opengles的pc端SDK,裡面好多demo

熱點內容
開封愛編程 發布:2025-01-31 12:33:27 瀏覽:293
帶編譯器的codeblocks 發布:2025-01-31 12:25:19 瀏覽:305
長江存儲電話 發布:2025-01-31 12:23:52 瀏覽:277
途游麻將直播需要什麼配置 發布:2025-01-31 12:13:18 瀏覽:69
centos65共享文件夾 發布:2025-01-31 12:11:26 瀏覽:186
編程語言排行榜2013 發布:2025-01-31 12:05:45 瀏覽:777
安卓下載比心需要哪些配置 發布:2025-01-31 12:05:43 瀏覽:404
stl源碼剖析侯捷pdf 發布:2025-01-31 11:41:20 瀏覽:535
linux操作命令查看 發布:2025-01-31 11:39:48 瀏覽:388
三角定位演算法 發布:2025-01-31 11:25:33 瀏覽:148