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

androidopengl30

發布時間:2023-01-11 20:31:14

android OpenGL表面崩潰在設備方向改變問題,怎麼解決

准備為了開始本次的教程,你必須具備:1.一款支持Android開發的IDE,如果你沒有的話,可以在AndroidDeveloperwebsite下載最新版本的Androidstudio。2.一款運行Android4.0之上Android手機,並且GPU支持OpenGLES2.03.對OpenGL的基本知識了解設置OpenGLES環境創建GLSurfaceView為了顯示OpenGL的圖形,你需要使用GLSurfaceView類,就像其他任何的View子類意義,你可以將它添加到你的Activity或Fragment之上,通過在布局xml文件中定義或者在代碼中創建實例。在本次的教程中,我們使用GLSurfaceView作為唯一的View在我們的Activity中,因此,為了簡便,我們在代碼中創建GLSurfaceView的實例並將其傳入setContentView中,這樣它將會填充你的整個手機屏幕。Activity中的onCreate方法如下:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);GLSurfaceViewview=newGLSurfaceView(this);setContentView(view);}123456123456因為媒體效果的框架僅僅支持OpenGLES2.0及以上的版本,所以在setEGLContextClientVersion方法中傳入2;view.setEGLContextClientVersion(2);11為了確保GLSurfaceView僅僅在必要的時候進行渲染,我們在setRenderMode方法中進行設置:view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);11創建RendererRenderer負責渲染GLSurfaceView中的內容。創建類實現介面GLSurfaceView.Renderer,在這里我們打算將這個類命名為EffectsRenderer,添加構造函數並覆寫介面中的抽象方法,如下:.Renderer{publicEffectsRenderer(Contextcontext){super();}@(GL10gl,EGLConfigconfig){}@(GL10gl,intwidth,intheight){}@OverridepublicvoidonDrawFrame(GL10gl){}}回到Activity中調用setRenderer方法,讓GLSurfaceView使用我們創建的Renderer:view.setRenderer(newEffectsRenderer(this));11編寫Manifest文件如果你想要發布你的App到谷歌商店,在AndroidManifest.xml文件中添加如下語句:11這會確保你的app只能被安裝在支持OpenGLES2.0的設備之上。現在OpenGL環境准備完畢。創建一個OpenGL平面定義頂點GLSurfaceView是不能直接顯示一張照片的,照片首先應該被轉化為紋理,應用在OpenGLsquare之上。在本次教程中,我將創建一個2D平面,並且具有4個頂點。為了簡單,我將使用一個長方形,現在,創建一個新的類Square,用它來代表形狀。publicclassSquare{}123123默認的OpenGL系統的坐標系中的原點是在中心,因此4個角的坐標可以表示為:左下角:(-1,-1)右下角:(1,-1)右上角:(1,1)左上角:(-1,1)我們使用OpenGL繪制的所有的物體都應該是由三角形決定的,為了畫一個方形,我們需要兩個具有一條公共邊的三角形,那意味著這些三角形的坐標應該是:triangle1:(-1,-1),(1,-1),和(-1,1)triangle2:(1,-1),(-1,1),和(1,1)創建一個float數組來代表這些頂點:privatefloatvertices[]={-1f,-1f,1f,-1f,-1f,1f,1f,1f,};123456123456為了在square上定位紋理,需要確定紋理的頂點坐標,創建另一個數組來表示紋理頂點的坐標:privatefloattextureVertices[]={0f,1f,1f,1f,0f,0f,1f,0f};123456123456創建緩沖區這些坐標數組應該被轉變為緩沖字元(bytebuffer)在OpenGL可以使用之前,接下來進行定義:;;1212在initializeBuffers方法中去初始化這些緩沖區:使用ByteBuffer.allocateDirect來創建緩沖區,因為float是4個位元組,那麼我們需要的byte數組的長度應該為float的4倍。下面使用ByteBuffer.nativeOrder方法來定義在底層的本地平台上的byte的順序。使用asFloatBuffer方法將ByteBuffer轉化為FloatBuffer,在FloatBuffer被創建後,我們調用put方法來將float數組放入緩沖區,最後,調用position方法來保證我們是由緩沖區的開頭進行讀取。privatevoidinitializeBuffers(){ByteBufferbuff=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);}創建著色器著色器只不過是簡單的運行在GPU中的每個單獨的頂點的C程序,在本次教程中,我們使用兩種著色器:頂點著色器和片段著色器。頂點著色器的代碼:attributevec4aPosition;attributevec2aTexPosition;varyingvec2vTexPosition;voidmain(){gl_Position=aPosition;vTexPosition=aTexPosition;};12345671234567片段著色器的代碼precisionmediumpfloat;uniformsampler2DuTexture;varyingvec2vTexPosition;voidmain(){gl_FragColor=texture2D(uTexture,vTexPosition);};123456123456如果你了解OpenGL,那麼這段代碼對你來說是熟悉的,如果你不能理解這段代碼,你可以參考OpenGLdocumentation。這里有一個簡明扼要的解釋:頂點著色器負責繪制單個頂點。aPosition是一個變數被綁定到FloatBuffer上,包含著這些頂點的坐標。相似的,aTexPosition是一個變數被綁定到FloatBuffer上,包含著紋理的坐標。gl_Position是一個在OpenGL中創建的變數,代表每一個頂點的位置,vTexPosition是一個數組變數,它的值被傳遞到片段著色器中。在本教程中,片段著色器負責square的著色。它使用texture2D方法從紋理中拾取顏色,並且使用一個在OpenGL中被創建的變數gl_FragColor將顏色分配到片段。在該類中,著色器的代碼應該被轉化為String。="attributevec4aPosition;"+"attributevec2aTexPosition;"+"varyingvec2vTexPosition;"+"voidmain(){"+"gl_Position=aPosition;"+"vTexPosition=aTexPosition;"+"}";="precisionmediumpfloat;"+"uniformsampler2DuTexture;"+"varyingvec2vTexPosition;"+"voidmain(){"+"gl_FragColor=texture2D(uTexture,vTexPosition);"+"}";創建程序創建新的方法initializeProgram來創建一個編譯和鏈接著色器的OpenGL程序。使用glCreateShader創建一個著色器對象,並且返回以int為表示形式的指針。為了創建頂點著色器,傳遞GL_VERTEX_SHADER給它。相似的,為了創建一個片段著色器,傳遞GL_FRAGMENT_SHADER給它。下面使用glShaderSource方法關聯相對應的著色器代碼到著色器上。使用glCompileShader編譯著色器代碼。在編譯了著色器的代碼後,創建一段新的的程序glCreateProgram,與glCreateShader相似,它也返回一個以int為表示形式的指針。調用glAttachShader方法附著著色器到程序中,最後,調用glLinkProgram進行鏈接。代碼:privateintvertexShader;privateintfragmentShader;privateintprogram;privatevoidinitializeProgram(){vertexShader=GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);GLES20.glShaderSource(vertexShader,vertexShaderCode);GLES20.glCompileShader(vertexShader);fragmentShader=GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);GLES20.glShaderSource(fragmentShader,fragmentShaderCode);GLES20.glCompileShader(fragmentShader);program=GLES20.glCreateProgram();GLES20.glAttachShader(program,vertexShader);GLES20.glAttachShader(program,fragmentShader);GLES20.glLinkProgram(program);}你可能會發現,OpenGL的方法(以gl開頭的)都是在GLES20類中,這是因為我們使用的是OpenGLES2.0,如果我們使用更高的版本,就會用到這些類:GLES30,GLES31。畫出形狀現在定義draw方法來利用我們之前定義的點和著色器進行繪制。下面是你需要做的:1.使用glBindFramebuffer方法創建一個幀緩沖對象(FBO)2.調用glUseProgram創建程序,就像之前所提3.傳遞GL_BLEND給glDisable方法,在渲染過程中禁用顏色的混合。4.調用glGetAttribLocation得到變數aPosition和aTexPosition的句柄5.使用glVertexAttribPointer連接aPosition和aTexPosition的句柄到各自的verticesBuffer和textureBuffer6.使用glBindTexture方法綁定紋理(作為draw方法的參數傳入)到片段著色器上7.調用glClear方法清空GLSurfaceView的內容8.最後,使用glDrawArrays方法畫出兩個三角形(也就是方形)代碼:publicvoiddraw(inttexture){GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);GLES20.glUseProgram(program);GLES20.glDisable(GLES20.GL_BLEND);intpositionHandle=GLES20.glGetAttribLocation(program,"aPosition");inttextureHandle=GLES20.glGetUniformLocation(program,"uTexture");inttexturePositionHandle=GLES20.glGetAttribLocation(program,"aTexPosition");GLES20.glVertexAttribPointer(texturePositionHandle,2,GLES20.GL_FLOAT,false,0,textureBuffer);GLES20.glEnableVertexAttribArray(texturePositionHandle);GLES20.glActiveTexture(GLES20.GL_TEXTURE0);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture);GLES20.glUniform1i(textureHandle,0);GLES20.glVertexAttribPointer(positionHandle,2,GLES20.GL_FLOAT,false,0,verticesBuffer);GLES20.glEnableVertexAttribArray(positionHandle);GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);}在構造函數中添加初始化方法:publicSquare(){initializeBuffers();initializeProgram();}12341234渲染OpenGL平面和紋理現在我們的渲染器什麼也沒做,我們需要改變它來渲染我們在前面創造的平面。首先,讓我們創建一個Bitmap,添加一張照片到res/drawable文件夾之下,我把它命名為forest.jpg,使用BitmapFactory將照片轉化為Bitmap。另外將照片的尺寸存儲下來。改變EffectsRenderer的構造函數如下,privateBitmapphoto;privateintphotoWidth,photoHeight;publicEffectsRenderer(Contextcontext){super();photo=BitmapFactory.decodeResource(context.getResources(),R.drawable.forest);photoWidth=photo.getWidth();photoHeight=photo.getHeight();}1234567812345678

⑵ 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 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方法來保證我們是由緩沖區的開頭進行讀取。

創建著色器
著色器只不過是簡單的運行在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。這里有一個簡明扼要的解釋:

頂點著色器負責繪制單個頂點。aPosition是一個變數被綁定到FloatBuffer上,包含著這些頂點的坐標。相似的,aTexPosition 是一個變數被綁定到FloatBuffer上,包含著紋理的坐標。gl_Position 是一個在OpenGL中創建的變數,代表每一個頂點的位置,vTexPosition是一個數組變數,它的值被傳遞到片段著色器中。

在本教程中,片段著色器負責square的著色。它使用texture2D方法從紋理中拾取顏色,並且使用一個在OpenGL中被創建的變數gl_FragColor將顏色分配到片段。

在該類中,著色器的代碼應該被轉化為String。

創建程序
創建新的方法initializeProgram來創建一個編譯和鏈接著色器的OpenGL程序。

使用glCreateShader創建一個著色器對象,並且返回以int為表示形式的指針。為了創建頂點著色器,傳遞GL_VERTEX_SHADER給它。相似的,為了創建一個片段著色器,傳遞GL_FRAGMENT_SHADER給它。下面使用glShaderSource方法關聯相對應的著色器代碼到著色器上。使用glCompileShader編譯著色器代碼。
在編譯了著色器的代碼後,創建一段新的的程序glCreateProgram,與glCreateShader相似,它也返回一個以int為表示形式的指針。調用glAttachShader方法附著著色器到程序中,最後,調用glLinkProgram進行鏈接。

你可能會發現,OpenGL的方法(以gl開頭的)都是在GLES20類中,這是因為我們使用的是OpenGL ES2.0,如果我們使用更高的版本,就會用到這些類:GLES30,GLES31。

畫出形狀
現在定義draw方法來利用我們之前定義的點和著色器進行繪制。

下面是你需要做的:
1.使用glBindFramebuffer方法創建一個幀緩沖對象(FBO)
2.調用glUseProgram創建程序,就像之前所提
3.傳遞GL_BLEND給glDisable方法,在渲染過程中禁用顏色的混合。
4.調用glGetAttribLocation得到變數aPosition和aTexPosition的句柄
5.使用glVertexAttribPointer連接aPosition和aTexPosition的句柄到各自的verticesBuffer和textureBuffer
6.使用glBindTexture方法綁定紋理(作為draw方法的參數傳入)到片段著色器上
7.調用glClear方法清空GLSurfaceView的內容
8.最後,使用glDrawArrays方法畫出兩個三角形(也就是方形)

<code avrasm="" class="hljs">public void draw(int texture){
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glUseProgram(program);
GLES20.glDisable(GLES20.GL_BLEND);

int positionHandle = GLES20.glGetAttribLocation(program, aPosition);
int textureHandle = GLES20.glGetUniformLocation(program, uTexture);
int texturePositionHandle = GLES20.glGetAttribLocation(program, aTexPosition);

GLES20.glVertexAttribPointer(texturePositionHandle, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
GLES20.glEnableVertexAttribArray(texturePositionHandle);

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
GLES20.glUniform1i(textureHandle, 0);

GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, verticesBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}</code>
在構造函數中添加初始化方法:

<code class="hljs" cs="">public Square(){
initializeBuffers();
initializeProgram();
}</code>
渲染OpenGL平面和紋理

現在我們的渲染器什麼也沒做,我們需要改變它來渲染我們在前面創造的平面。

首先,讓我們創建一個Bitmap,添加一張照片到res/drawable文件夾之下,我把它命名為forest.jpg,使用BitmapFactory將照片轉化為Bitmap。另外將照片的尺寸存儲下來。

改變EffectsRenderer的構造函數如下,

<code class="hljs" java="">private Bitmap photo;
private int photoWidth, photoHeight;
public EffectsRenderer(Context context){
super();
photo = BitmapFactory.decodeResource(context.getResources(), R.drawable.forest);
photoWidth = photo.getWidth();
photoHeight = photo.getHeight();
}</code>
創建一個新的方法generateSquare,將Bitmap轉化為紋理,並且出初始化Square對象,你也需要一個數組來保存對紋理的引用,使用glGenTextures來初始化這個數組,glBindTexture方法來在位置0激活紋理。
現在,調用glTexParameteri設置不同的級別,決定紋理被怎樣渲染。

設置GL_TEXTURE_MIN_FILTER(修正功能),GL_TEXTURE_MAG_FILTER(放大功能)給GL_LINEAR,確保圖片是平滑的在它被拉伸的時候。

設置GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T給GL_CLAMP_TO_EDGE,保證紋理不會重復。

最後調用texImage2D方法將Bitmap放置到紋理中,實現方法如下:

<code avrasm="" class="hljs">private int textures[] = new int[2];
private Square square;

private void generateSquare(){
GLES20.glGenTextures(2, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, photo, 0);
square = new Square();
}</code>
當GLSurfaceView的尺寸發生改變時,onSurfaceChanged方法被調用,這時我們需要調用glViewPort確認新的尺寸。調用glClearColor使其變為黑色,接著調用generateSquare重新初始化紋理和平面。

<code class="hljs" java="">@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0,0,width, height);
GLES20.glClearColor(0,0,0,1);
generateSquare();
}</code>
最後在onDrawFrame調用draw方法:

<code class="hljs" java="">@Override
public void onDrawFrame(GL10 gl) {
square.draw(textures[0]);
}</code>
最後,你可以運行程序,在手機上看到你選擇的圖片被渲染出來

⑷ Android OpenGL游戲開發

將opengl的view動態添加進relativelayout中,再將你需要添加的按鈕也動態添加進這個relativelayout中,最近剛好做到了這個。。。。

⑸ 如何學習android opengl

它為OpenGL提供一個專用的渲染線程,使主線程得以繼續。

它支持連續或按需渲染,維護屏幕設置以及OpenGL和底層窗口系統之間的介面。代碼如下:

@Override

publicvoidonCreate(BundlesavedInstanceState)

{

super.onCreate(savedInstanceState);

mGLSurfaceView=newGLSurfaceView(this);

//檢測系統是否支持OpenGLES2.0

=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

=activityManager.getDeviceConfigurationInfo();

finalbooleansupportsEs2=configurationInfo.reqGlEsVersion>=0x20000;

if(supportsEs2)

{

mGLSurfaceView.setEGLContextClientVersion(2);

mGLSurfaceView.setRenderer(newLessonOneRenderer());

}

else

{

return;

}

setContentView(mGLSurfaceView);

}

在onCreate()方法裡面主要是創建OpenGLES2.0上下文以及做一些初始化工作。在onCreate()中,調用超類之後的第一件事情就是創建GLSurfaceView。然後確定系統是否支持OpenGLES2.0。因此,我們需要一個可以與全局系統狀態相交互的ActivityManager實例,以及使用這個實例來得到設備配置信息,該信息將通知我們設備是否支持OpenGLES2.0。

一旦確定設備是否支持OpenGLES2.0後,就會通知表面視圖需要一個與OpenGLES2.0相兼容的視圖,然後傳遞一個自定義渲染。這個渲染將在任何需要調整表面或者繪制一個新的幀的時候被系統調用。我們還通過傳遞一個不同的渲染來支持OpenGLEs1.x,盡管可能由於APIs的不同,導致我們需要編寫不同的代碼,但在這一節中,我們將只關注OpenGLES2.0。

最後,我們為GLSurfaceView設置內容視圖,它通知Android活動內容應該填補OpenGL表面,代碼如下:

@Override

protectedvoidonResume()

{

super.onResume();

mGLSurfaceView.onResume();

}

@Override

protectedvoidonPause()

{

super.onPause();

mGLSurfaceView.onPause();

}

GLSurfaceView要求我們在任何父Activity的onResume()和onPause()方法被調用的時候調用onResume()和onPause()方法。

⑹ Android中涉及OpenGL坐標知識

在使用OpenGL ES2.0渲染圖像到時候,經常需要跟坐標系打交道,由於目前主要還是研究二維的坐標,所有我們就先忽略三圍的z軸。
1、安卓屏幕坐標系,如下圖:

2、OpenGL中頂點坐標系,如下圖:

因為OpenGL ES2.0,只能支持繪制點、線、和三角形,所有其餘的一些簡單形狀需要利用前面的幾種去拼接。

紋理坐標是:

總結下,紋理坐標是通過頂點坐標的位置,在紋理坐標中找到該點斜對角的點坐標即可。

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

⑻ Android中的OpenGL ES使用基礎

因為Android的GUI系統是基於OpenGL/EGL實現的,所以先介紹相關基礎知識。
OpenGL(Open Graphics Library)已佔據虛擬現實、CAD、能源、游戲研發等多個行業領域,是跨語言,跨平台的2D/3D圖形處理王者。
OpenGL ES(OpenGL for Embedded Systems)是專門面向嵌入式系統的OpenGL API子集,Android系統從版本早期開始支持此圖形庫。

3D(Three-Dimensional)一般情況下是指長、寬、深度(高度)三個維度的圖形。
OpenGL只支持三種基本幾何元素:點,線段,三角形。
圖形管線(Graphics Pipiline/Rendering Pipeline)指圖形硬體設備支持的渲染流程,是以3D數據為輸入,最終輸出2D光柵圖形的一種流水線處理過程。

⑼ android opengl

1:需要哪些包?
這個很難說,要看你的游戲用到什麼功能。
2:有必要使用opengl嗎?
最好用上,怎麼說opengl也是比java更底層的,圖像的運算處理效率會更高,而且學好opengl,就算你以後轉去做蘋果了,或是你的游戲要開發蘋果版的,也能快速轉型和移植(蘋果也是有opengl的)
3:使用opengl做的2d游戲比使用j2me的game包有哪些優勢及不足??
opengl的優勢上面說了,不足就是會更難入手,首先用opengl的話,你就不能用那些又方便又好用的java介面了,然後要搭建NDK平台,再然後,opengl es(手機上的opengl 叫opengl es)的學習資料很少,很難入門。我個人就用opengl es寫過一個2d的應用,用習慣之後就很順手的。

閱讀全文

與androidopengl30相關的資料

熱點內容
usb藍牙android 瀏覽:405
伺服器顯示error1什麼意思 瀏覽:708
python代碼精簡 瀏覽:457
文件加密了怎麼找到了 瀏覽:193
jellyfin插件怎麼選擇主伺服器 瀏覽:836
asp用戶注冊源碼 瀏覽:48
什麼是照片壓縮文件 瀏覽:392
java調用js代碼 瀏覽:979
崑山市民app怎麼修改身份信息 瀏覽:779
php登陸次數 瀏覽:744
python字元轉成數字 瀏覽:822
海川用的是什麼伺服器 瀏覽:376
口才是練出來的pdf 瀏覽:458
雲伺服器哪個公司性價比高 瀏覽:517
源碼論壇打包 瀏覽:558
php怎麼做成word 瀏覽:692
python批量生成密鑰 瀏覽:492
程序員要不要考社區人員 瀏覽:150
app的錢怎麼充q幣 瀏覽:814
android銀行卡識別 瀏覽:756