对openGL早有耳闻,但是刚接触android下的opengl,做个demo学习下,
先把opengl的框架搭建起来:只要有如下几个文件,
openActivity.java ----作为启动入口,android通过GLSurfaceView显示openGL试图,而GLSurfaceView提供了专门渲染3D的Renderer接口
GLRender.java ----渲染图形
GLImage.java ----获取资源文件
GLRender.java 实现Renderer接口:只要实现如下方法:
public void onDrawFrame(GL10 gl); //进行图形的绘制
public void onSurfaceChanged(GL10 gl, int width, int height);
public void onSurfaceCreated(GL10 gl, EGLConfig config);
GLRender.java 代码如下:
package com.aurora.android.render;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.Random;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import com.aurora.android.model.GLImage;
import com.aurora.android.model.Star;
import android.opengl.GLUtils;
import android.opengl.GLSurfaceView.Renderer;
import android.view.KeyEvent;
public class GLRender implements Renderer {
public static final int num = 50;
public Star[] star = new Star[num];
Random random = new Random();
boolean key;
boolean twinkle = true;
float spin;
float zoom = -10.0f;
float tilt = 90.0f;
int texture;
int one = 0x10000;
//纹理数据
IntBuffer coords = IntBuffer.wrap(new int[] {
0, 0,
one, 0,
one, one,
0,one });
IntBuffer vertexs = IntBuffer.wrap(new int[] {
-one, -one, 0,
one, -one, 0,
one, one, 0,
-one, one, 0 });
ByteBuffer indices = ByteBuffer.wrap(new byte[] {
1, 0, 2, 3
});
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);//绑定纹理
for (int i = 0; i < num; i++) {
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, zoom);
gl.glRotatef(tilt, 1.0f, 0.0f, 0.0f);
gl.glRotatef(star[i].angle, 0.0f, 1.0f, 0.0f);
gl.glTranslatef(star[i].dist, 0.0f, 0.0f);
gl.glRotatef(-star[i].angle, 0.0f, 1.0f, 0.0f);
gl.glRotatef(-tilt, 1.0f, 0.0f, 0.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//启用顶点
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//启用着色
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//启用纹理
if (twinkle) {//启用星星闪烁效果
//使用byte型数值指定一颜色
gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,
(float) star[(num - i) - 1].g / 255.0f,
(float) star[(num - i) - 1].b / 255.0f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coords);
{
coords.position(0);
vertexs.position(0);
indices.position(0);
//绘图
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4,
GL10.GL_UNSIGNED_BYTE, indices);
}
//闪烁星星绘制完成
gl.glFinish();
}
//绕z轴旋转
gl.glRotatef(spin, 0.0f, 0.0f, 1.0f);
gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,
(float) star[(num - i) - 1].g / 255.0f,
(float) star[(num - i) - 1].b / 255.0f, 1.0f);
gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coords);
{
coords.position(0);
vertexs.position(0);
indices.position(0);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4,
GL10.GL_UNSIGNED_BYTE, indices);
}
gl.glFinish();
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
spin += 0.01f;
star[i].angle += (float) (i) / (float) num;
star[i].dist -= 0.01f;
if (star[i].dist < 0.0f) {
star[i].dist += 5.0f;
star[i].r = random.nextInt(256);
star[i].g = random.nextInt(256);
star[i].b = random.nextInt(256);
}
}
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
float ratio = (float) width / height;
gl.glViewport(0, 0, width, height);// 设置场景大小
gl.glMatrixMode(GL10.GL_PROJECTION);// 设置投影矩阵
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);// 设置视口大小
gl.glMatrixMode(GL10.GL_MODELVIEW);// 设置观察模式
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
gl.glShadeModel(GL10.GL_SMOOTH);// 启用平滑
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 设置黑背景
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 精细的透视修正
IntBuffer intBuffer = IntBuffer.allocate(1);
gl.glGenTextures(1, intBuffer);
texture = intBuffer.get();
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap, 0);
gl.glEnable(GL10.GL_TEXTURE_2D);// 设置纹理
gl.glShadeModel(GL10.GL_SMOOTH);// 启用平滑
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 设置黑背景
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 精细的透视修正
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);// 设置混合函数取半透明
gl.glEnable(GL10.GL_BLEND);// 设置混色
for (int i = 0; i < num; i++) {
Star starTemp = new Star();
starTemp.angle = 0.0f;
starTemp.dist = ((float) (i) / (float) num) * 5.0f;
starTemp.r = random.nextInt(256);
starTemp.g = random.nextInt(256);
starTemp.b = random.nextInt(256);
star[i] = starTemp;
}
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
twinkle = !twinkle;
return false;
}
}
openActivity.java代码如下:
package com.aurora.android.advanced;
import com.aurora.android.model.GLImage;
import com.aurora.android.render.GLRender;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.KeyEvent;
public class OpenActivity extends Activity {
GLRender render = new GLRender();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLImage.load(this.getResources());
GLSurfaceView glView = new GLSurfaceView(this);
glView.setRenderer(render);
setContentView(glView);
}
public boolean onKeyUp(int keyCode, KeyEvent event){
render.onKeyUp(keyCode, event);
return false;
}
}
GLImage.java:
package com.aurora.android.model;
import com.aurora.android.advanced.R;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class GLImage {
public static Bitmap mBitmap;
public static void load(Resources resource){
//获取图片资源
mBitmap = BitmapFactory.decodeResource(resource, R.drawable.star);
}
}
Star.java:星星
package com.aurora.android.model;
public class Star {
public int r,g,b; //星星RGB颜色
public float dist;//星星距离中心的距离
public float angle = 0.0f; //当前星星处的角度
}
- 大小: 53.3 KB
分享到:
相关推荐
Android Camera 内置人脸识别的Demo
Android OpenGL ES 2.0 开发教程 从入门到精通和Demo(内容详细、简单,易学)
OpenGL es2.0 小行星展示全景图demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android应用源码开发Demo,主要用于毕业设计学习。
Android应用源码开发Demo,主要用于毕业设计学习。
1.Android开发之OpenGL+ES教程 2.Android下Opengl+ES导引 3.OpenGL_ES_Programming_Guide_v1.0.2part1 4.OpenGL_ES_Programming_Guide_v1.0.2Part2 5.OpenGL + es + 2.0 + demo 6.OpenGL + ES + three + books 7....
Android全景相机,OpenGL,非常好用,Android视频提取全景图demo
Android应用源码开发Demo,主要用于毕业设计学习。
说明这是一个Android OpenGLES2.0从零开始的Demo程序,仅做个人学习OpenGLES的记录,并提供给后来初学者参考。若有相关问题,也非常乐意与大家一起讨论共同进步。关于Android OpenGLES2.0学习的博客,也相当于这个...
Android应用源码开发Demo,主要用于毕业设计学习。
FirstOpenGlDemo。本文主要通过学习《OpenGL ES应用开发实践指南(Android卷)》一书所做笔记,加上自己的理解编写,涉及的代码均出自原书。
Android应用源码开发Demo,主要用于毕业设计学习。
GraphicsTestBed 此项目为学习Android Graphics时写的各种Demo,根据目录排放如下,...CameraV1GLSurfaceView:对应博客为 - Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时处理(黑白滤镜) CameraV
该应用程序的目的是学习和共享如何使用OpenGLES和Android进行绘制。 由于这是我的第一个Android应用程序,因此很可能存在错误; 但我将尝试继续改进该应用程序并添加更多功能。 Wafefront格式(OBJ): ://en....
[开源项目]Android_炫酷的3D音乐播放器_各种特效OpenGL.zip andorid 源码北京公交线路查询(离线).zip android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip Android ListView下拉刷新 Demo.zip ...
AndroidStudio开发的一个简单的VRdemo工程(用到Cardboard、OpenGLES2.0、shader)
android 3D开发实例,火力篮球,代码详细,有各种相关类,有详细的注释,有PPT分析,可以很好的理解opengl es 的运作原理,对android 3D游戏开发的初学者有很大的帮助
一个C ++库,通过获取符合样式表,将其应用于符合,并使用OpenGL或Metal渲染,从而在多个平台上的本机应用程序中为可自定义矢量地图提供动力。 要将交互式地图使用特定于平台的语言嵌入到本机应用程序中,请安装...
利用OPEN GL 3D开发的一个应用,很好的Demo,代码注视十分详细,是初学者的很好的例子