Android OpenGL 開發


2013-06-30

Android OpenGL 開發

Android提供OpenGL包,專門用於3D的加速和渲染等。

OpenGL, Open Graphics Library, 是一個專業的圖形程序接口,是一個功能強大、調用方便的底層圖形庫。

OpenGL ES ,基於OpenGL API設計,是OpenGL三維圖形API的子集,是專為內嵌和移動設備設計的一個2D/3D輕量圖形庫。

OpenGL ES 1.0  基於OpenGL 1.3,OpenGL ES 1.1 基於 OpenGL 1.5,OpenGL ES 2.0 基於 OpenGL 2.0。

 

1. Android構建一個3D開發的基本框架

// 導入庫

import javax.microedition.khronos.opengles.GL10;

// 實例化OpenGLContext

GL10 gl = (GL10) mOpenGLContext.getGL();

// 在onDraw方法開始

mOpenGLContext.waitNative();

// 在onDraw方法結束

mOpenGLContext.waitGL();

GLSurfaceView包含一個專門用於渲染3D的接口Renderer

// 引入Renderer

import android.opengl.GLSurfaceView.Renderer;

// 創建Renderer接口的一個實現類

public class GLRender implements Renderer

// 在GLRender類中,實現三個抽象方法

public void onDrawFrame(GL10 gl);

// 窗口發生改變

public void onSurfaceChanged(GL10 gl, int width, int height);

// 窗口創建

public void onSurfaceCreated(GL10 gl, EGLConfig config);

// 在onSurfaceCreated方法中初始化

// 修正透視

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

// R, G, B, A

gl.glClearColor(0, 0, 0, 0);

// 陰影平滑

gl.glShadeModel(GL10.GL_SMOOTH);

// 設置深度緩存

gl.glClearDepthf(1.0f);

// 啟用深度測試

gl.glEnable(GL10.GL_DEPTH_TEST);

// 深度測試類型

gl.glDepthFunc(GL10.GL_LEQUAL);

// 在onSurfaceChanged方法中

// 設置OpenGL場景的大小

gl.glViewport(0, 0, width, height);

// 為屏幕設置透視圖,意味着越遠的東西看起來越小

// 投影矩陣負責為場景增加透視

gl.glMatrixModel(GL10.GL_PROJECTION);

// 將所選的矩陣狀態恢復成原始狀態

gl.glLoadIdentity();

// 設置視口的大小

// 前面4個參數確定窗口大小,后面兩個參數確定深度的起點和終點

gl.glFrustumf(-ratio, ratio, –1, 1, 1, 10);

// 指明任何新的變化將影響ModelView Matrix

gl.glMatrixModel(GL10.GL_MODELVIEW);

// 恢復成原始狀態

gl.glLoadIdentity();

// 在onDrawFrame方法中

// 清除屏幕和深度緩存

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glLoadIdentity();

// 設置Renderer

Renderer render = new GLRender();

GLSurfaceView glView = new GLSurfaceView(this);

glView.setRenderer(render);

setContentView(glView);

 

2. 多邊形

在OpenGL中繪制的任何模型都會被分解成三角形、四邊形。

OpenGL坐標系:調用glLoadIdentity()之后,當前點移到屏幕中心,x坐標軸從左至右,y坐標軸從下至上,z坐標軸從里往外。

在3D空間中,三角形每個頂點由(x, y, z)組成。

// 平移操作

gl.glTranslatef(-1.5f, 0.0f, –6.0f);

// 開啟頂點設置功能

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

// 設置頂點數據

gl.glVertexPointer(int size, int type, int stride, Buffer pointer)

gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);

參數1:size, 用於描述頂點的尺寸,(x,y,z)坐標系,所以是3

參數2:type, 描述頂點的類型

參數3:stride, 描述了步長

參數4:pointer, 頂點緩存,即我們創建的頂點數組

// 三角形的三個頂點

private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{0, one, 0, –one, –one, 0, one, –one, 0});

// 將頂點繪制出來

gl.glDrawArray(int mode, int first, int count)

gl.glDrawArray(GL10.GL_TRIANGLES, 0, 3);

參數1:mode, 描述了繪制的模式

參數2:first, 開始位置

參數3:count, 要繪制的頂點計數

// 重置當前的模擬觀察矩陣

gl.glLoadIdentity();

// 左移1.5單位,並移入屏幕6.0

gl.glTranslatef(1.5f, 0.0f, –6.0f);

// 設置和繪制正方形

gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);

gl.glDrawArray(GL10.GL_TRIANGLE_STRIP, 0, 4);

// 取消頂點設置

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

通過glEnableClientState方法開啟了頂點設置功能,在使用完成之后,需要通過glDisableClientState(GL10.GL_VERTEX_ARRAY);方法關閉/取消頂點設置功能。

 

3. 顏色

學習如何對圖形進行着色,兩種不同的着色方式,分別是:平滑/光滑着色(Smooth Coloring)和平面/單調着色(Flat Coloring)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM