`
abc20899
  • 浏览: 933274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android opengl es 七彩星星效果(转载)

阅读更多
01.Activity类:  
02. 
03.package sim.feel;  
02. 
03.import android.app.Activity;   04.import android.content.res.Resources;   05.import android.graphics.Bitmap;   06.import android.graphics.BitmapFactory;   07.import android.opengl.GLSurfaceView;   08.import android.os.Bundle;   09. 
10.public class Star extends Activity {   11.    private GLSurfaceView glSurfaceView;   12.    private MyRenderer renderer;   13. 
14.    @Override  15.    public void onCreate(Bundle savedInstanceState) {   16.        super.onCreate(savedInstanceState);   17.        Load.loadBitmap(getResources());  
18.        renderer = new MyRenderer();   19.        glSurfaceView = new GLSurfaceView(this);   20.        glSurfaceView.setRenderer(renderer);  
21.        setContentView(glSurfaceView);  
22.    }  
23.}  
24. 
25.class Load {   26.    public static Bitmap bitmap;   27. 
28.    public static void loadBitmap(Resources res) {   29.        bitmap = BitmapFactory.decodeResource(res, R.drawable.star);  
30.    }  
31.}  
32. 
33.Renderer类:  
34. 
35.package sim.feel;   36. 
37.import java.nio.ByteBuffer;   38.import java.nio.ByteOrder;   39.import java.nio.IntBuffer;   40.import java.util.Random;   41. 
42.import javax.microedition.khronos.egl.EGLConfig;   43.import javax.microedition.khronos.opengles.GL10;   44. 
45.import android.opengl.GLSurfaceView.Renderer;   46.import android.opengl.GLUtils;   47. 
48.public class MyRenderer implements Renderer {   49.    private int one = 0x10000;   50.    private IntBuffer vertexBuffer;   51.    private int[] vertex = new int[] { -one, -one, 0, one, -one, 0, -one, one,   52.            0, one, one, 0 };   53.    private IntBuffer coordBuffer;   54.    private int[] coord = { 0, 0, one, 0, 0, one, one, one };   55.    private int[] textures = new int[1];   56.    private Random random = new Random();   57.    // 闪烁的星星   58.    boolean twinkle = true;   59.    // star数目   60.    int num = 50;   61.    // star数目数组   62.    NiceStar[] star = new NiceStar[num];   63.    // star 倾角   64.    float tilt = 90.0f;   65.    // star 距人的dist   66.    float zoom = -10.0f;   67.    float spin; // 闪烁星星的自转   68. 
69.    // init数据   70.    public void initData() {   71.        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertex.length * 4);   72.        byteBuffer.order(ByteOrder.nativeOrder());  
73.        vertexBuffer = byteBuffer.asIntBuffer();  
74.        vertexBuffer.put(vertex);  
75.        vertexBuffer.position(0);   76. 
77.        ByteBuffer coordByteBuffer = ByteBuffer  
78.                .allocateDirect(coord.length * 4);   79.        coordByteBuffer.order(ByteOrder.nativeOrder());  
80.        coordBuffer = coordByteBuffer.asIntBuffer();  
81.        coordBuffer.put(coord);  
82.        coordBuffer.position(0);   83.    }  
84. 
85.    @Override  86.    public void onDrawFrame(GL10 gl) {   87.        // 清除屏幕和深度缓存   88.        gl.glClear(GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT);  
89.        // 初始化数据   90.        initData();  
91. 
92.        for (int i = 0; i < num; i++) {   93.            gl.glLoadIdentity();  
94.            // 向屏幕里移入zoom   95.            gl.glTranslatef(0.0f, 0.0f, zoom);   96. 
97.            gl.glRotatef(tilt, 1.0f, 0.0f, 0.0f); // 倾斜视角   98.            gl.glRotatef(star[i].angle, 0.0f, 1.0f, 0.0f); // 旋转至当前所画星星的角度   99.            gl.glTranslatef(star[i].dist, 0.0f, 0.0f); // 沿X轴正向移动   100.            gl.glRotatef(-star[i].angle, 0.0f, 1.0f, 0.0f); // 取消当前星星的角度   101.            gl.glRotatef(-tilt, 1.0f, 0.0f, 0.0f); // 取消屏幕倾斜   102. 
103.            // 开启顶点、颜色和纹理   104.            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
105.            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);  
106.            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
107. 
108.            if (twinkle) // 启用闪烁效果   109.            {  
110.                // 使用byte型数值指定一个颜色   111.                gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,   112.                        (float) star[(num - i) - 1].g / 255.0f,   113.                        (float) star[(num - i) - 1].b / 255.0f, 1.0f);   114.                gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer);   115.                gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coordBuffer);   116.                // 绘制   117.                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);   118.                // 绘制结束   119.                gl.glFinish();  
120.            }  
121.              
122.            gl.glRotatef(spin, 0.0f, 0.0f, 1.0f); // 绕z轴旋转星星   123. 
124.            // 使用byte型数值指定一个颜色   125.            gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,   126.                    (float) star[(num - i) - 1].g / 255.0f,   127.                    (float) star[(num - i) - 1].b / 255.0f, 1.0f);   128. 
129.            gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexBuffer);   130.            gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coordBuffer);   131.            // 绘制   132.            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);   133.            // 关闭顶点、颜色和纹理   134.            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
135.            gl.glDisableClientState(GL10.GL_COLOR_ARRAY);  
136.            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  
137. 
138.            spin += 0.01f; // 星星的公转   139.            star[i].angle += (float) (i) / (float) num; // 改变星星的自转角度   140.            star[i].dist -= 0.01f; // 改变星星离中心的距离   141. 
142.            if (star[i].dist < 0.0f) // 星星到达中心了么   143.            {  
144.                // 往外移5个单位   145.                star[i].dist += 5.0f;   146.                // 赋一个新红色分量   147.                star[i].r = random.nextInt(256);   148.                // 赋一个新绿色分量   149.                star[i].g = random.nextInt(256);   150.                // 赋一个新蓝色分量   151.                star[i].b = random.nextInt(256);   152.            }  
153.        }  
154.    }  
155. 
156.    @Override  157.    public void onSurfaceChanged(GL10 gl, int width, int height) {   158.        gl.glViewport(0, 0, width, height);   159.        float ratio = (float) width / height;   160.        gl.glMatrixMode(GL10.GL_PROJECTION);  
161.        gl.glLoadIdentity();  
162.        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);   163.        // 设置观察模型   164.        gl.glMatrixMode(GL10.GL_MODELVIEW);  
165.        gl.glLoadIdentity();  
166.    }  
167. 
168.    @Override  169.    public void onSurfaceCreated(GL10 gl, EGLConfig config) {   170.        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  
171.        // 黑色背景色   172.        gl.glClearColorx(0, 0, 0, 0);   173.        // 启用阴影平滑   174.        gl.glShadeModel(GL10.GL_SMOOTH);  
175.        // 启用深度测试   176.        gl.glEnable(GL10.GL_DEPTH_TEST);  
177.        // 深度测试类型   178.        gl.glDepthFunc(GL10.GL_LEQUAL);  
179.        // 设置深度缓存   180.        gl.glClearDepthf(1.0f);   181. 
182.        // 启用纹理   183.        gl.glEnable(GL10.GL_TEXTURE_2D);  
184.        // 生成纹理   185.        gl.glGenTextures(1, textures, 0);   186.        // 绑定纹理   187.        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);   188.        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, Load.bitmap, 0);   189. 
190.        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE); // 设置混色函数取得半透明效果   191.        gl.glEnable(GL10.GL_BLEND); // 启用混色   192. 
193.        // loop all star   194.        for (int i = 0; i < num; i++) {   195.            NiceStar starTmp = new NiceStar();   196.            // all star from 0 angle   197.            starTmp.angle = 0.0f;   198.            // calc star 距离   199.            starTmp.dist = ((float) (i) / (float) num) * 5.0f;   200.            // set red   201.            starTmp.r = random.nextInt(256);   202.            // set green   203.            starTmp.g = random.nextInt(256);   204.            // set blue   205.            starTmp.b = random.nextInt(256);   206. 
207.            star[i] = starTmp;  
208.        }  
209.    }  
210.}  
211. 
212.class NiceStar {   213.    // star颜色   214.    int r, g, b;   215.    // star距中心距离   216.    float dist;   217.    // current star angle   218.    float angle = 0.0f;   219.}
分享到:
评论

相关推荐

    Android OpenGL ES 简明开发教程

    `GLSurfaceView`充当OpenGL ES与Android View层次结构之间的桥梁,它不仅适应于Android Activity的生命周期,还简化了Framebuffer像素格式的选择,以及创建和管理绘图线程,确保动画效果平滑流畅。此外,它还提供了...

    Android OpenGL ES 2.0学习书籍.rar

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

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

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

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

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

    Android OpenGL ES MetaBall 2D融球效果

    平台:Android 语言:GLSL(OpenGL ES) 算法:MetaBall 效果:2D融球效果

    Android OpenGL | ES 实现雾气效果源码

    在Android应用开发中,利用OpenGL ES可以实现许多视觉特效,其中包括模拟自然界中的雾气效果。本篇文章将深入探讨如何通过OpenGL ES在Android中实现雾气效果,并基于提供的"OpenGLFogTest"源码进行解析。 首先,...

    android opengl es 粒子,火焰

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

    Android平台OpenGLES生成使用Mipmap纹理

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

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

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

    Android下 OpenGL ES 2.0 混合半透明效果demo

    在这个"Android下 OpenGL ES 2.0 混合半透明效果demo"中,我们将探讨如何在Android应用中实现半透明效果的混合。 首先,理解OpenGL ES 2.0的核心概念至关重要。它基于着色器模型,这意味着开发者可以编写顶点着色器...

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

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

    Android OpenGL ES多重采样抗锯齿MSAA演示demo源码

    Android OpenGL ES多重采样抗锯齿MSAA演示demo源码 多重采样抗锯齿MSAA,详解见:https://blog.csdn.net/github_27263697/article/details/143859755 目录 一、抗锯齿概念 二、多重采样 三、OpenGL中的MSAA 1、...

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    总的来说,这个项目涉及了Android开发中的3D图形编程,通过OpenGL ES绘制不同类型的几何形状,每个形状作为一个独立的类实现,而renderer类则负责把这些形状渲染到屏幕上,创造出丰富的3D视觉效果。理解并掌握这些...

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

    在Android的JNI层使用OpenGL ES,可以实现高性能的图形绘制,包括自定义UI元素、游戏图形和其他复杂视觉效果。要使用OpenGL ES,首先需要在JNI层初始化OpenGL ES上下文,然后创建顶点和纹理数据,最后通过绘制调用来...

    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要实现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 opengles2.0 jni

    在Android应用开发中,结合OpenGL ES 2.0和JNI,开发者可以实现更复杂、性能更强的图形特效,例如“水波纹效果”。 在Android中,OpenGL ES 2.0相比于1.0版本引入了着色器语言(GLSL),这使得开发者可以直接编写...

    android OpenGL ES 中文 API

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

Global site tag (gtag.js) - Google Analytics