OpenglES2.0 for Android:第一个OpenglES应用

原创 2016年05月30日 18:23:00

OpenglES2.0 for Android:第一个OpenglES应用


首先我们新建一个Android工程:com.opengl.openglestest

打开MainActivity,定义一个GLSurfaceView对象,GLSurfaceView是SurfaceView视图的子类,GLSurfaceView主要用于管理着色器(Render)。
然后调用其setEGLContextClientVersion方法选择OpenglES2.0的上下文,最后添加着色器以及setContentView,代码如下(MainActivity.java ):

<span style="font-size:14px;">package com.cumt.openglestwo_test_one;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	private GLSurfaceView glSurfaceView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		glSurfaceView = new GLSurfaceView(this);
		glSurfaceView.setEGLContextClientVersion(2); // Pick an OpenGL ES 2.0 context.
		glSurfaceView.setRenderer(new MyRender());
		setContentView(glSurfaceView);
	}
}</span>
最后还要注意GLSurfaceView的生命周期,完整代码如下(MainActivity.java):

<span style="font-size:14px;">package com.cumt.openglestwo_test_one;

import com.cumt.render.MyRender;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	private GLSurfaceView glSurfaceView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		glSurfaceView = new GLSurfaceView(this);
		glSurfaceView.setEGLContextClientVersion(2); // Pick an OpenGL ES 2.0 context.
		glSurfaceView.setRenderer(new MyRender());
		setContentView(glSurfaceView);
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		glSurfaceView.onPause();
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		glSurfaceView.onResume();
	}

}</span>


这里我们还要自己实现着色器程序:

新建一个包render,在该包下新建类MyRender引入Renderer接口。此时代码如下(MyRender.java):

<span style="font-size:14px;">package com.cumt.render;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;

public class MyRender implements Renderer {
	
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub

	}

	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub

	}

	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub

	}

}</span>

第一个函数onSurfaceCreated当Surface被绘制或者重新绘制的时候调用,我们常常在该类中定义物体对象,纹理对象等。
第二个函数onSurfaceChanged当Surface改变size时调用或者一开始在onSurfaceCreated调用之后被调用。我们常常在该类中设置相机,投影等。
第三个函数onDrawFrame当物体被绘制时调用,此函数一直处于被调用状态。

我们来测试一下调用过程:代码如下(MyRender.java):

<span style="font-size:14px;">package com.cumt.render;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
import android.util.Log;

public class MyRender implements Renderer {
	
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub
		Log.w("render","onSurfaceCreated");
	}

	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub
		Log.w("render","onSurfaceChanged");
	}

	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		Log.w("render","onDrawFrame");
	}

}</span>

Logcat输出结果:




此时运行一下发现整个手机屏幕都是黑色的,看不到任何东西,下面我们来设置一个颜色(MyRender.java):

<span style="font-size:14px;">package com.cumt.render;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glViewport;
import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;

public class MyRender implements Renderer {
	
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub
		//First:设置清空屏幕用的颜色,前三个参数对应红绿蓝,最后一个对应alpha
		glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
	}

	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub
		//Second:设置视口尺寸,即告诉opengl可以用来渲染的surface大小
		glViewport(0,0,width,height);
	}

	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		//Third:清空屏幕,擦除屏幕上所有的颜色,并用之前glClearColor定义的颜色填充整个屏幕
		glClear(GL_COLOR_BUFFER_BIT);
	}
}</span>

运行效果:



至此第一个opengl es for android的小demo以及完成了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

abdroid fragment adapter 的详细介绍

在一个 Android 应用中,我使用 FragmentPagerAdapter 来处理多 Fragment 页面的横向滑动。不过我碰到了一个问题,即当 Fragment 对应的数据集发生改变时,我希...

OpenglES2.0 for Android:来画个三角形吧

OpenglES2.0 for Android:来画个三角形吧 先看看我们的整个流程: 理解坐标系: 左侧是Opengl默认的坐标系,右边...

OpenglES2.0 for Android:纹理映射

OpenglES2.0 for Android:纹理映射 前言  纹理映射又叫做纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。就是把一幅图像贴到三维物体的表面上来增强真实感, 可...

OpenglES2.0 for Android:来画个圆吧

OpenglES2.0 for Android:来画个圆吧 首先看看本节的流程: 计算圆的顶点坐标: 我们先要明白OpenglES中圆是怎么画的,前面我们已经知道三角形扇的绘制方式,我...

OpenglES2.0 for Android:来画个矩形吧

OpenglES2.0 for Android:来画个矩形吧 上一节中我们绘制了一个三角形,我们在上一节的基础上来完成矩形的绘制 。 OK,开始动手做吧,首先在上一节的项目中的shape目录下...

OpenglES2.0 for Android:来画个立方体吧

OpenglES2.0 for Android:来画个立方体吧 前言: 前面一直在说OpenglES2.0二维图形的绘制,接下来我们步入三维的世界 ,三维世界远比二维要有趣的多,与此同时复杂性也要...

Opengles2.0 for android入门笔记(一)

oepngles2.0 for android的教程少的可怜,有的居然还是opengles 1.0版本的。鄙人刚学opengles,理论也是一知半解,其实android已经帮我们封装了一些内容了,so...

OpenglES2.0 for Android:来做个地球吧

OpenglES2.0 for Android:来做个地球吧 上两节中我们说了纹理映射,也利用纹理给我们的平面图形以及立方体穿上了漂亮的衣服,在继续学习其他知识之前,让我们先来用纹理映射以及我们前...

OpenglES2.0 for Android:各种变换来一波

OpenglES2.0 for Android:各种变换来一波 监听屏幕事件 在进行各种变换之前,我们先来了解一下如何监听屏幕的事件。我们下面的变换都需要用立方体来演示,所以我们继续使用上一节的绘制立...

OpenglES2.0 for Android:来画个球吧

OpenglES2.0 for Android:来画个球吧 首先看下球的坐标系 ,如图 :                             (图来自百度百科 ) 设球上有一点 A ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenglES2.0 for Android:第一个OpenglES应用
举报原因:
原因补充:

(最多只允许输入30个字)