`

Android OpenGL ES学习

阅读更多

Android用的是OpenGL图形函数库,它可以跨平台。
OpenGL的定义:OpenGL(Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
Android所用到的是它的一个子集OpenGL ES(OpenGL for Embedded Systems(嵌入式系统))就是OpenGL的嵌入式版本。
1.主activity

package com.jftt.opengl;

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

public class OpenGL extends Activity {
	private static final String TAG = OpenGL.class.getSimpleName();
	private VortexView vortexView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		vortexView = new VortexView(this);
		setContentView(vortexView);
	}

	@Override
	protected void onPause() {
		super.onPause();
		vortexView.onPause();
	}

	@Override
	protected void onResume() {
		super.onResume();
		vortexView.onResume();
	}
}

 


2.继承GLSurfaceView类的自己的View

package com.jftt.opengl;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;

public class VortexView extends GLSurfaceView {
	private static final String LOG_TAG = VortexView.class.getSimpleName();
	private VortexRenderer renderer;

	public VortexView(Context context) {
		super(context);
		renderer = new VortexRenderer();
		setRenderer(renderer);
	}
	
	@Override
	public boolean onTouchEvent(final MotionEvent event) {
		queueEvent(new Runnable() {
			@Override
			public void run() {
				renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
				renderer.setAngle(event.getX() / 10);
			}
		});
		return super.onTouchEvent(event);
	}
}

 


3.实现渲染器renderer类

package com.jftt.opengl;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

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

import android.opengl.GLSurfaceView;

public class VortexRenderer implements GLSurfaceView.Renderer {
	private static final String TAG = VortexRenderer.class.getSimpleName();

	private float red = 0f;
	private float green = 0f;
	private float blue = 0f;

	private ShortBuffer indexBuffer;
	private FloatBuffer vertexBuffer;
	private short[] indicesArray = { 0, 1, 2 };
	private int numberOfVertices = 3;
	
	private float angle;
	
	private void initTriangle() {
		ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);
		vbb.order(ByteOrder.nativeOrder());
		vertexBuffer = vbb.asFloatBuffer();

		ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);
		ibb.order(ByteOrder.nativeOrder());
		indexBuffer = ibb.asShortBuffer();

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

		vertexBuffer.put(coords);
		indexBuffer.put(indicesArray);

		vertexBuffer.position(0);
		indexBuffer.position(0);
	}

	public void setColor(float red, float green, float blue) {
		this.red = red;
		this.green = green;
		this.blue = blue;
	}
	
	public void setAngle(float angle){
		this.angle = angle;
	}

	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		initTriangle();
	}

	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		gl.glViewport(0, 0, width, height);
	}

	@Override
	public void onDrawFrame(GL10 gl) {
		gl.glClearColor(red, green, blue, 1.0f);
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
		gl.glRotatef(angle, 0f, 1f, 0f);
		gl.glColor4f(0.5f, 0f, 0f, 0.5f);
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
		gl.glDrawElements(GL10.GL_TRIANGLES, numberOfVertices, GL10.GL_UNSIGNED_SHORT, indexBuffer);
	}
}

 


4.封装的三角形的类

package com.jftt.opengl;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import java.util.Random;

public class Triangle {
	private short[] myIndecesArray = { 0, 1, 2 };
	private int numberOfVertices = 3;

	private float red = 0f;
	private float green = 0f;
	private float blue = 0f;

	// a raw buffer to hold indices allowing a reuse of points.
	private ShortBuffer indexBuffer;
	// a raw buffer to hold the vertices
	private FloatBuffer vertexBuffer;
	private Random random = new Random();

	public Triangle() {
		red = random.nextFloat();
		red = red - (float) Math.floor(red);
		green = random.nextFloat();
		green = green - (float) Math.floor(green);
		blue = random.nextFloat();
		blue = blue - (float) Math.floor(blue);

		ByteBuffer vbb = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4);
		vbb.order(ByteOrder.nativeOrder());
		vertexBuffer = vbb.asFloatBuffer();

		ByteBuffer ibb = ByteBuffer.allocateDirect(numberOfVertices * 2);
		ibb.order(ByteOrder.nativeOrder());
		indexBuffer = ibb.asShortBuffer();

		float[] coords = { randomValue(red), randomValue(red),
				randomValue(red), randomValue(green), randomValue(green),
				randomValue(green), randomValue(blue), randomValue(blue),
				randomValue(blue) };

		for (int i = 0; i < numberOfVertices; i++) {
			for (int j = 0; j < 3; j++) {
				vertexBuffer.put(coords[i * 3 + j]);
			}
		}

		for (int i = 0; i < 3; i++) {
			indexBuffer.put(myIndecesArray[i]);
		}
		vertexBuffer.position(0);
		indexBuffer.position(0);
	}

	private float randomValue(float value) {
		int tmp = random.nextInt(2);
		if (tmp == 0) {
			tmp = -1;
		}
		return value * tmp;
	}

	public FloatBuffer getVertexBuffer() {
		return vertexBuffer;
	}

	public ShortBuffer getIndexBuffer() {
		return indexBuffer;
	}

	public int getNumberOfVertices() {
		return numberOfVertices;
	}

	public float getGreen() {
		return green;
	}

	public float getRed() {
		return red;
	}

	public float getBlue() {
		return blue;
	}
}

 

分享到:
评论

相关推荐

    Android OpenGL ES简明学习资料

    含有以下4个pdf,主要介绍基本概念和用法,对初学者非常有用。...Android OpenGL ES 简明开发教程.pdf Android_OpenGL_ES_book.pdf OpenGL ES 2 for Android.pdf Apress.Pro.OpenGL.ES.for.Android.Feb.2012.pdf

    Android OpenGL ES 2.0学习书籍.rar

    最后,了解如何与硬件加速的OpenGLES API交互,以及熟悉GLSL语言(OpenGL Shading Language),是成为OpenGL ES 2.0专家的必经之路。通过编写高效、可读性强的着色器代码,可以创造出各种复杂的视觉效果,实现令人...

    Android OpenglES 学习笔记代码

    package ljh.opengl;是对OpenglES的一些封装。 package ljh.game;是对一些游戏常用的代码的封装 都没写完! 最近改学IOS了 看看什么时候能补充完。

    Android OpenGL ES 简明开发教程

    ### Android OpenGL ES 开发教程详解 #### 概述与历史沿革 OpenGL ES(OpenGL for Embedded Systems)作为OpenGL API的子集,专为移动设备、PDA和游戏主机等嵌入式系统设计,旨在简化3D图形应用的开发流程。自2003...

    Android OpenGl ES绘制圆点与优化圆点锯齿

    在Android平台上,OpenGL ES是一种广泛使用的图形库,用于在移动设备上实现高性能的2D和3D图形渲染。本文将深入探讨如何使用OpenGL ES来绘制圆点,并介绍一种方法来优化圆点边缘的锯齿问题,提升视觉效果。 首先,...

    Android平台使用OpenGLES2.0显示YUV数据

    本教程主要探讨如何在Android系统上,利用OpenGLES2.0图形库来处理和显示从Camera获取的YUV原始数据。YUV是一种常见的颜色空间,广泛应用于视频编码和解码,因为它对带宽的要求相对较低,特别适合移动设备。 首先,...

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    android openGl es2.0以画线的模式画成一个矩形 只有4条边中间透明

    Android OpenGL ES 绘制三维/空间坐标系透明

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android系统中,它用于创建高性能的2D和3D图形。在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程...

    Android平台OpenGLES生成使用Mipmap纹理

    该案例代码为Android 平台OpenGL ES实现举例,有两个作用: ...2、使用 OpenGLES 生成与使用Mipmap纹理,构建远处模糊,近处清晰的效果。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/8873106

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    在Android平台上,JNI(Java Native Interface)允许开发者使用C++代码来增强应用程序的功能,尤其是在处理图形和计算密集型任务时,如使用OpenGL ES和OpenCV。这个特定的项目旨在通过JNI调用来结合这两个强大的库...

    Android中opengl es要实现Obj格式的3D导入

    OpenGL ES在Android平台上的应用是实现3D图形渲染的关键技术,而Obj文件格式是一种常见的3D模型数据交换格式。在Android开发中,如果想要将Obj格式的3D模型导入到应用中,就需要对OpenGL ES有深入的理解,并且掌握...

    Android openGL ES 画球

    Android openGL ES 画球

    android openGL ES使用小例子

    android openGL 里面提供了illegalArgumentException异常的解决方法

    android opengl es 粒子,火焰

    OpenGL ES 是一种在嵌入式设备上广泛使用的图形库,特别是在Android平台上,它用于创建复杂的2D和3D图形效果。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限的移动设备设计。在Android系统中,...

    android openGL ES 2.0画等边三角形,正方形

    android openGL ES 2.0画等边三角形,正方形

    Android平台 OpenGL ES3.0绘制点、线、三角形实现源码

    Android平台,OpenGL ES3.0 点、线、三角形绘制方式源码实现举例。 相关绘制方式文章讲解请参考: https://xiaxl.blog.csdn.net/article/details/8873002

    Android开发之OpenGL ES教程

    OpenGL ES (Embedded Systems) 是一个轻量...通过这个教程,开发者可以逐步学习如何在Android应用中设置和使用OpenGL ES,创建复杂的3D图形和动画,同时理解如何有效地利用`GLSurfaceView`提供的特性来优化性能和调试。

    android OpenGL ES 中文 API

    `GL10`接口是`javax.microedition.khronos.opengles`包中的一个核心接口,它继承自`GL`接口,并且是`GL11`接口的父接口。`GL10`接口封装了OpenGL ES的基本功能,包括核心渲染命令和其他一些重要的扩展特性。此接口...

    Android平台 使用OpenGLES3.0实现纹理纹理、颜色混合

    在Android平台,使用OpenGLES3.0实现纹理纹理、颜色混合代码实现举例。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/121634894

Global site tag (gtag.js) - Google Analytics