Android OpenGL ES教程.docx

上传人:b****5 文档编号:7227726 上传时间:2023-01-22 格式:DOCX 页数:25 大小:30.94KB
下载 相关 举报
Android OpenGL ES教程.docx_第1页
第1页 / 共25页
Android OpenGL ES教程.docx_第2页
第2页 / 共25页
Android OpenGL ES教程.docx_第3页
第3页 / 共25页
Android OpenGL ES教程.docx_第4页
第4页 / 共25页
Android OpenGL ES教程.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

Android OpenGL ES教程.docx

《Android OpenGL ES教程.docx》由会员分享,可在线阅读,更多相关《Android OpenGL ES教程.docx(25页珍藏版)》请在冰豆网上搜索。

Android OpenGL ES教程.docx

AndroidOpenGLES教程

第一课OpenGlES介绍

Android用的是OpenGL图形函数库,它可以跨平台。

 

OpenGL的定义:

OpenGL(OpenGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。

OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

 

Android所用到的是它的一个子集OpenGLES(OpenGLforEmbeddedSystems(嵌入式系统))就是OpenGL的嵌入式版本。

 

1.主activity

Java代码  

1.package com.jftt.opengl;  

2.  

3.import android.app.Activity;  

4.import android.os.Bundle;  

5.  

6.public class OpenGL extends Activity {  

7.    private static final String TAG = OpenGL.class.getSimpleName();  

8.    private VortexView vortexView;  

9.  

10.    @Override  

11.    public void onCreate(Bundle savedInstanceState) {  

12.        super.onCreate(savedInstanceState);  

13.        vortexView = new VortexView(this);  

14.        setContentView(vortexView);  

15.    }  

16.  

17.    @Override  

18.    protected void onPause() {  

19.        super.onPause();  

20.        vortexView.onPause();  

21.    }  

22.  

23.    @Override  

24.    protected void onResume() {  

25.        super.onResume();  

26.        vortexView.onResume();  

27.    }  

28.}  

 

2.继承GLSurfaceView类的自己的View

Java代码  

1.package com.jftt.opengl;  

2.  

3.import android.content.Context;  

4.import android.opengl.GLSurfaceView;  

5.import android.view.MotionEvent;  

6.  

7.public class VortexView extends GLSurfaceView {  

8.    private static final String LOG_TAG = VortexView.class.getSimpleName();  

9.    private VortexRenderer renderer;  

10.  

11.    public VortexView(Context context) {  

12.        super(context);  

13.        renderer = new VortexRenderer();  

14.        setRenderer(renderer);  

15.    }  

16.      

17.    @Override  

18.    public boolean onTouchEvent(final MotionEvent event) {  

19.        queueEvent(new Runnable() {  

20.            @Override  

21.            public void run() {  

22.                renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);  

23.                renderer.setAngle(event.getX() / 10);  

24.            }  

25.        });  

26.        return super.onTouchEvent(event);  

27.    }  

28.}  

 

3.实现渲染器renderer类

Java代码  

1.package com.jftt.opengl;  

2.  

3.import java.nio.ByteBuffer;  

4.import java.nio.ByteOrder;  

5.import java.nio.FloatBuffer;  

6.import java.nio.ShortBuffer;  

7.  

8.import javax.microedition.khronos.egl.EGLConfig;  

9.import javax.microedition.khronos.opengles.GL10;  

10.  

11.import android.opengl.GLSurfaceView;  

12.  

13.public class VortexRenderer implements GLSurfaceView.Renderer {  

14.    private static final String TAG = VortexRenderer.class.getSimpleName();  

15.  

16.    private float red = 0f;  

17.    private float green = 0f;  

18.    private float blue = 0f;  

19.  

20.    private ShortBuffer indexBuffer;  

21.    private FloatBuffer vertexBuffer;  

22.    private short[] indicesArray = { 0, 1, 2 };  

23.    private int numberOfVertices = 3;  

24.      

25.    private float angle;  

26.      

27.    private void initTriangle() {  

28.        ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);  

29.        vbb.order(ByteOrder.nativeOrder());  

30.        vertexBuffer = vbb.asFloatBuffer();  

31.  

32.        ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);  

33.        ibb.order(ByteOrder.nativeOrder());  

34.        indexBuffer = ibb.asShortBuffer();  

35.  

36.        float[] coords = { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f };  

37.  

38.        vertexBuffer.put(coords);  

39.        indexBuffer.put(indicesArray);  

40.  

41.        vertexBuffer.position(0);  

42.        indexBuffer.position(0);  

43.    }  

44.  

45.    public void setColor(float red, float green, float blue) {  

46.        this.red = red;  

47.        this.green = green;  

48.        this.blue = blue;  

49.    }  

50.      

51.    public void setAngle(float angle){  

52.        this.angle = angle;  

53.    }  

54.  

55.    @Override  

56.    public void onSurfaceCreated(GL10 gl, EGLConfig config) {  

57.        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  

58.        initTriangle();  

59.    }  

60.  

61.    @Override  

62.    public void onSurfaceChanged(GL10 gl, int width, int height) {  

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

64.    }  

65.  

66.    @Override  

67.    public void onDrawFrame(GL10 gl) {  

68.        gl.glClearColor(red, green, blue, 1.0f);  

69.        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  

70.        gl.glRotatef(angle, 0f, 1f, 0f);  

71.        gl.glColor4f(0.5f, 0f, 0f, 0.5f);  

72.        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);  

73.        gl.glDrawElements(GL10.GL_TRIANGLES, numberOfVertices, GL10.GL_UNSIGNED_SHORT, indexBuffer);  

74.    }  

75.}  

 

4.封装的三角形的类

Java代码  

1.package com.jftt.opengl;  

2.  

3.import java.nio.ByteBuffer;  

4.import java.nio.ByteOrder;  

5.import java.nio.FloatBuffer;  

6.import java.nio.ShortBuffer;  

7.import java.util.Random;  

8.  

9.public class Triangle {  

10.    private short[] myIndecesArray = { 0, 1, 2 };  

11.    private int numberOfVertices = 3;  

12.  

13.    private float red = 0f;  

14.    private float green = 0f;  

15.    private float blue = 0f;  

16.  

17.    // a raw buffer to hold indices allowing a reuse of points.  

18.    private ShortBuffer indexBuffer;  

19.    // a raw buffer to hold the vertices  

20.    private FloatBuffer vertexBuffer;  

21.    private Random random = new Random();  

22.  

23.    public Triangle() {  

24.        red = random.nextFloat();  

25.        red = red - (float) Math.floor(red);  

26.        green = random.nextFloat();  

27.        green = green - (float) Math.floor(green);  

28.        blue = random.nextFloat();  

29.        blue = blue - (float) Math.floor(blue);  

30.  

31.        ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);  

32.        vbb.order(ByteOrder.nativeOrder());  

33.        vertexBuffer = vbb.asFloatBuffer();  

34.  

35.        ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);  

36.        ibb.order(ByteOrder.nativeOrder());  

37.        indexBuffer = ibb.asShortBuffer();  

38.  

39.        float[] coords = { randomValue(red), randomValue(red),  

40.                randomValue(red), randomValue(green), randomValue(green),  

41.                randomValue(green), randomValue(blue), randomValue(blue),  

42.                randomValue(blue) };  

43.  

44.        for (int i = 0; i < numberOfVertices; i++) {  

45.            for (int j = 0; j < 3; j++) {  

46.                vertexBuffer.put(coords[i * 3 + j]);  

47.            }  

48.        }  

49.  

50.        for (int i = 0; i < 3; i++) {  

51.            indexBuffer.put(myIndecesArray[i]);  

52.        }  

53.        vertexBuffer.position(0);  

54.        indexBuffer.position(0);  

55.    }  

56.  

57.    private float randomValue(float value) {  

58.        int tmp = random.nextInt

(2);  

59.        if (tmp == 0) {  

60.            tmp = -1;  

61.        }  

62.        return value * tmp;  

63.    }  

64.  

65.    public FloatBuffer getVertexBuffer() {  

66.        return vertexBuffer;  

67.    }  

68.  

69.    public ShortBuffer getIndexBuffer() {  

70.        return indexBuffer;  

71.    }  

72.  

73.    public int getNumberOfVertices() {  

74.        return numberOfVertices;  

75.    }  

76.  

77.    public float getGreen() {  

78.        return green;  

79.    }  

80.  

81.    public float getRed() {  

82.        return red;  

83.    }  

84.  

85.    public float getBlue() {  

86.        return blue;  

87.    }  

88.}  

第二课第一个OpenGL项目

首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何建立一个android的项目,同时了解activity的生命周期和android下的屏幕或键盘响应机制。

好的,开始建立一个android的项目Lesson1,Activity的名字的名字我们叫Lesson

 

package com.xinli;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.Window;

import android.view.WindowManager;

 

public class Lesson extends Activity{

    private OpenGLView mOpenGLView;

    

    @Override

    public void onCreate(BundlesavedInstanceState){

        super.onCreate(savedInstanceState);

        //去标题栏

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        //设置全屏

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

             WindowManager.LayoutParams.FLAG_FULLSCREEN);

       

        mOpenGLView = new OpenGLView(this);

        setContentView(mOpenGLView);

    }

}

 

我们在这里用了一个OpenGLView类,把这个类直接设为contentView。

package com.xinli;

 

import android.content.Context;

import android.opengl.GLSurfaceView;

 

public class OpenGLView extends GLSurfaceView{

    private OpenGLRenderer mRenderer;

 

    public OpenGLView(Contextcontext){

       super(context);

       mRenderer = new OpenGLRenderer();

       setRenderer(mRenderer);

       // TODO Auto-generatedconstructorstub

    }

 

}

OpenGLView类继承自GLSurfaceView,这个类是android提供的用opengl画图的类。

这里用了OpenGLRenderer类,Render是渲染的意思,真正画图的操作在这个类里面。

package com.xinli;

 

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

 

import android.opengl.GLSurfaceView.Renderer;

 

public class OpenGLRenderer implements Renderer{

 

    @Override

    public void onDrawFrame(GL10gl){

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

       gl.glLoadIdentity();

    }

 

    @Override

    public void onSurfaceChanged(GL10gl, int width, int height){

       // 设置输出屏幕大小

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

    }

 

    @Override

    public void onSurfaceCreated(GL10gl,EGLConfigconfig){

       // TODO Auto-gener

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1