`

android系统下使用openGL开发demo

阅读更多
对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 OpenGL 图片Texture渲染render 演示demo

    Android OpenGL 图片Texture渲染render 演示demo 1、开发语言:Kotlin 2、开发环境:Android studio 3、图片纹理渲染简介 OpenGL图片纹理渲染‌是指在3D图形渲染过程中,将2D图片(纹理)映射到3D物体表面的过程。这...

    Android-AndroidCamera内置人脸识别的Demo

    在Android平台上,内置的人脸识别功能为开发者提供了一种便捷的...这个Demo对于学习Android摄像头编程和人脸识别技术来说是一个很好的起点,开发者可以通过它深入理解相关原理并进行二次开发,以满足特定项目的需求。

    Android OpenGL和Demo以及源代码

    在“Android OpenGL Demo 源代码”中,你可能会看到以下示例: - **NeHe教程**:NeHe是一个经典的OpenGL教程系列,也适用于OpenGL ES。它提供了许多基础到高级的示例,帮助开发者理解OpenGL的工作原理。例如,你...

    基于Android NDK 进行 OpenGL_ES开发的完整案例.doc

    Demo 程序是一个使用 Android NDK 和 OpenGL ES 开发的完整案例。程序包括一个 Java 项目和一个 C 语言开发的原生库。Java 项目使用 GLSurfaceView 来显示 OpenGL 视图,并使用 JNI 调用 C 语言开发的原生代码。C ...

    OpenGLES demo - 3. 建立Android工程

    1. **Android Studio与项目创建**:首先,你需要使用Android Studio,它是Google官方推荐的Android应用开发集成开发环境(IDE)。创建新项目时,选择"Empty Activity"模板,并为项目命名。确保在项目配置时,最低API...

    android游戏开发Demo

    在Android游戏开发领域,"android游戏开发Demo"是一个非常实用的学习资源,它为开发者提供了实践游戏框架搭建的基础。这个Demo程序代码集可以帮助初学者更好地理解游戏开发的核心概念和技术,同时也为有经验的开发者...

    android opengl es 2.0官方demo

    在"android opengl es 2.0官方demo"中,我们可以学习到以下关键知识点: 1. **OpenGL ES 2.0 API**:与1.1版相比,OpenGL ES 2.0引入了基于着色器的模型,这使得开发者能够自定义顶点和片段处理,提高了灵活性和...

    OpenGLES 2.0 for android 开发教程 从入门到精通和Demo

    在Android系统中,OpenGLES 2.0是用于图形渲染的重要框架,支持3D图形和复杂的视觉效果。本教程旨在帮助开发者从零基础开始掌握OpenGLES 2.0,并通过实例Demo加深理解。 入门篇: 1. **环境配置**:首先,你需要...

    Android平台上使用openGL进行开发的demo集合仓库.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现轻松复现,拿到资料包后可轻松复刻出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 ...

    opengl_es 3.0 Demo

    OpenGL ES 3.0是移动设备上的一...学习这些Demo,不仅能提升你的OpenGL ES 3.0编程能力,还能为开发高质量的3D应用打下坚实基础。建议按照每个示例逐步学习,理解其背后的图形学概念,并尝试自己修改代码,以加深理解。

    基于QT的OPENGL ES代码纹理DEMO

    【基于QT的OPENGL ES代码纹理DEMO】是一个示例项目,它展示了如何在QT框架下使用OpenGL ES来处理纹理。OpenGL ES(Embedded Systems)是OpenGL的一个子集,专为嵌入式设备如智能手机、平板电脑等设计,提供2D和3D...

    Android 使用opengl写动态壁纸的类库-IT计算机-毕业设计.zip

    这个Android应用源码Demo提供了一个很好的实践平台,帮助你深入理解OpenGL在Android系统中的运用。 首先,你需要了解OpenGL ES的基本概念。OpenGL ES是跨语言、跨平台的图形库,专为嵌入式设备设计,包括智能手机和...

    安卓Android源码——360全景查看demo.rar

    3. **Sensor Integration**:为了实现用户可以自由旋转和查看全景图,Demo可能整合了Android的传感器系统,如陀螺仪和加速度计。这些传感器的数据可以用来追踪设备的运动,从而更新全景图的视角。 4. **Touch ...

    openGLES简单学习-demo

    openGLES在Android系统中广泛应用于游戏开发、图像处理和科学可视化等领域。 **3D图形基础** 在开始学习openGLES之前,我们需要了解一些3D图形的基本概念。3D空间是由三个轴组成的:X轴、Y轴和Z轴。每个物体可以由...

    Android OpenGL粒子系统演示demo

    开发环境Android studio 粒子系统简介 。粒子是一种基本的图形元素,它们通常被表示为一组点。通过巧妙地组合一些基础的物理效果,我们能够创造出许多令人惊叹的视觉效果。想象一下,我们可以模拟一个水滴从喷泉中喷...

    安卓Android源码——3D立方体旋转demo.zip

    "安卓Android源码——3D立方体旋转demo.zip" 是一个与Android平台相关的编程资源,其中包含了实现3D立方体旋转的示例代码。这通常用于教学或者开发者测试Android设备上的OpenGL ES(OpenGL for Embedded Systems)...

    Android Opengles 开发入门技术文档

    OpenGL ES 是一种针对嵌入式系统的图形库,用于在移动设备上进行2D和3D图形渲染。在Android平台上,OpenGL ES 的应用广泛,尤其是在游戏和复杂用户界面的设计中。本文档将引导开发者逐步了解并掌握Android上的OpenGL...

    安卓VR相关-OpenGLes2.0小行星展示全景图demo.rar

    OpenGL es2.0 小行星展示全景图demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    安卓Android源码——360全景查看demo.zip

    "安卓Android源码——360全景查看demo.zip" 这个标题表明我们关注的是一个关于Android平台的源代码示例,它专注于实现360度全景查看的功能。全景查看通常用于虚拟现实(VR)或增强现实(AR)应用,让用户能够通过...

Global site tag (gtag.js) - Google Analytics