`
abc20899
  • 浏览: 927500 次
  • 性别: 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 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 OpenGL ES 绘制三维/空间坐标系透明

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

    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中的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的基本功能,包括核心渲染命令和其他一些重要的扩展特性。此接口...

    Android开发之OpenGL ES教程

    Android平台上的OpenGL ES教程主要帮助开发者了解如何在Android应用程序中集成和使用这个库来创建交互式的图形界面。 在Android上设置OpenGL ES视图是开发过程中的第一步,而`GLSurfaceView`是实现这一目标的关键...

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

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

Global site tag (gtag.js) - Google Analytics