android opengl es 粒子效果实例代码
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                android opengl es 粒子效果实例代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                概述:粒子系統采用許多形狀簡單的微小粒子作為基本元素,用它們來表示不規則模糊物體,系統中的每個粒子都有各自的生命周期,我們可以管理它們從創建到消亡的時間,它們都要經歷“產生”、“運動”、“消亡”這三個階段。
下面我們做個簡單的粒子效果,但感覺我做的效果跟原先想象的,有點不一樣,還得繼續改進,呵呵。
代碼如下:
 1、Activity類代碼
2、bitmap初始化類
import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /*** 將圖片轉成bitmap* **/ public class initBitmap {public static Bitmap bitmap;public static void init(Resources res){bitmap = BitmapFactory.decodeResource(res, R.drawable.particle3) ;} }3、粒子屬性類
/*** * 粒子屬性類**/ public class Particle {boolean active; //是否激活狀態float live;//粒子生命float fade; //衰減速度float r; //紅色值float g; //綠色值float b; //藍色值//變量x.y和z控制粒子在屏幕上顯示的位置.float x; //x位置float y; //y位置float z; //z位置//這三個變量控制粒子在每個軸上移動的快慢和方向.如果xi是負價粒//子將會向左移動,正值將會向右移動.float xi; // x方向float yi; // y方向float zi; // z方向/*** 每一個變量可被看成加速度.如果xg正值時,粒子將會被拉倒右邊,負值* 將拉向左邊.所以如果粒子向左移動(負的)而我們給它一個正的加速度,粒子速度將變慢.*/float xg; //x方向重力加速度float yg; //y方向重力加速度float zg; //z方向重力加速度 }
4、渲染類 import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.Random;import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;import android.graphics.Bitmap; import android.opengl.GLUtils; import android.opengl.GLSurfaceView.Renderer;/*** 粒子系統效果實現類** date:2012-07-03*/ public class ParticleRenderer implements Renderer {private int[] textures = new int[1];private Bitmap bitmap = initBitmap.bitmap;private static final int MAX_PARTICLE = 1000; //最大數private boolean rainbow = true; //是否為彩虹模式private float slowdown = 2.0f;//減速粒子private float xspeed ; //x方向上的速度private float yspeed;//y方向上的速度private float zoom = -30.0f;//沿Z軸縮放private int loop ; //循環變量private int color; //當前的顏色private int delay; //彩虹效果延遲private Random random = new Random();//創建一個粒子數組private Particle particles[] = new Particle[MAX_PARTICLE];//存儲12中不同的顏色.對每一個顏色從0到11private float colors[][] = {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},{0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},{0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}};FloatBuffer vertexBuffer;FloatBuffer coordBuffer;private float[] vertexs = new float[12];private float[] coords = new float[8];//初始化緩沖public void initBuffer(){ByteBuffer verbb = ByteBuffer.allocateDirect(vertexs.length * 4);verbb.order(ByteOrder.nativeOrder());vertexBuffer = verbb.asFloatBuffer();vertexBuffer.put(vertexs);vertexBuffer.position(0);ByteBuffer coordbb = ByteBuffer.allocateDirect(coords.length * 4);coordbb.order(ByteOrder.nativeOrder());coordBuffer = coordbb.asFloatBuffer();coordBuffer.put(coords);coordBuffer.position(0);}//隨機生成0~999數public int rand(){return Math.abs(random.nextInt(1000));}// 初始化粒子public void initParticle(int num, int color, float xDir, float yDir,float zDir) {Particle par = new Particle();par.active = true;par.live = 1.0f;par.fade = rand() % 100 / 1000.0f + 0.003f;//我們分配粒子一種新的顏色.par.r = colors[color][0];par.g = colors[color][1];par.b = colors[color][2];// 在粒子從新設置之后,將給它新的移動速度/方向par.xi = xDir;par.yi = yDir;par.zi = zDir;par.xg = 0.0f;par.yg = -0.5f;// zgpar.zg = 0.0f;particles[loop] = par;}@Overridepublic void onDrawFrame(GL10 gl) {initBuffer();//初始化gl.glClear(GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_COLOR_BUFFER_BIT);gl.glLoadIdentity();gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//頂點和紋理設置gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, coordBuffer);for (loop = 0; loop < MAX_PARTICLE; loop++) {if (particles[loop].active) { //激活// 返回X軸的位置float x = particles[loop].x;// 返回Y軸的位置float y = particles[loop].y;// 返回Z軸的位置,zoom則在原視角基礎上加上zoomfloat z = particles[loop].z + zoom;// 設置粒子顏色gl.glColor4f(particles[loop].r, particles[loop].g,particles[loop].b, particles[loop].live);coordBuffer.clear();vertexBuffer.clear();coordBuffer.put(1.0f);coordBuffer.put(1.0f);vertexBuffer.put(x + 0.5f);vertexBuffer.put(y + 0.5f);vertexBuffer.put(z);coordBuffer.put(1.0f);coordBuffer.put(0.0f);vertexBuffer.put(x + 0.5f);vertexBuffer.put(y);vertexBuffer.put(z);coordBuffer.put(0.0f);coordBuffer.put(1.0f);vertexBuffer.put(x);vertexBuffer.put(y + 0.5f);vertexBuffer.put(z);coordBuffer.put(0.0f);coordBuffer.put(0.0f);vertexBuffer.put(x);vertexBuffer.put(y);vertexBuffer.put(z);// 繪制gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);//我們也重新設定粒子在屏幕中心放置.我們重新設定粒子的x,y和z位置為零particles[loop].x += particles[loop].xi / (slowdown * 1000);// 更新Y坐標的位置particles[loop].y += particles[loop].yi / (slowdown * 1000);// 更新Z坐標的位置particles[loop].z += particles[loop].zi / (slowdown * 1000);// 更新X軸方向速度大小particles[loop].xi += particles[loop].xg;// 更新Y軸方向速度大小particles[loop].yi += particles[loop].yg;// 更新Z軸方向速度大小particles[loop].zi += particles[loop].zg;// 減少粒子的生命值particles[loop].live -= particles[loop].fade;// 如果粒子生命小于0if (particles[loop].live < 0.0f) { particles[loop] = new Particle();particles[loop].active = true;particles[loop].live = 1.0f; particles[loop].fade = (float)(rand()%100)/1000.0f +0.003f;//我們也重新設定粒子在屏幕中心放置.我們重新設定粒子的x,y和z位置為零particles[loop].x = 0.0f;particles[loop].y = 0.0f;particles[loop].z = 0.0f;//在粒子從新設置之后,將給它新的移動速度/方向particles[loop].xi = xspeed +(float)((rand()%50)-33.0f)* 12.0f ;//x方向particles[loop].yi = yspeed+(float)((rand()%50)-33.0f) * 12.0f;//y方向particles[loop].zi = (float)((rand()%50)-33.0f)* 12.0f ; //z方向//最后我們分配粒子一種新的顏色.particles[loop].r = colors[color][0];particles[loop].g = colors[color][1];particles[loop].b = colors[color][2];}}}gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);gl.glFinish(); }@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {// 設置場景大小gl.glViewport(0, 0, width, height);if (height == 0) {height = 1;}float ratio = (float) width / height;// 投影矩陣gl.glMatrixMode(GL10.GL_PROJECTION);// 重置視圖gl.glLoadIdentity();// 設置視圖的大小gl.glFrustumf(-ratio, ratio, -1, 1, 1, 200);// 設置觀察模型gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 黑色背景色gl.glClearColorx(0, 0, 0, 0);// 啟用陰影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 注意:關閉深度測試gl.glDisable(GL10.GL_DEPTH_TEST);//啟用混合 gl.glEnable(GL10.GL_BLEND);// 啟用紋理gl.glEnable(GL10.GL_TEXTURE_2D);// 創建紋理gl.glGenTextures(1, textures, 0);// 綁定紋理gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);//生成紋理GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);//線性濾波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);//縮小時 /*** 初始化所有的粒子*/for (loop = 0; loop < MAX_PARTICLE; loop++) {particles[loop] = new Particle();particles[loop].active = true; //激活particles[loop].live = 1.0f; //開始生命為1particles[loop].fade = (float)(rand()%100)/1000.0f + 0.003f;//隨機生成衰減速率particles[loop].r = colors[loop *(12/MAX_PARTICLE)][0];particles[loop].g = colors[loop *(12/MAX_PARTICLE)][1];particles[loop].b = colors[loop *(12/MAX_PARTICLE)][2];particles[loop].xi = (float)((rand()%50)-26.0f)* 12.0f;//x方向particles[loop].yi = (float)((rand()%50)-25.0f)* 12.0f;//y方向particles[loop].zi = (float)((rand()%50)-25.0f)* 12.0f;//z方向particles[loop].xg = 0.0f; //x方向上的加速度particles[loop].yg = -0.9f;//y方向上的加速度particles[loop].zg = 0.0f;//z方向上的加速度} } }
5、運行效果:
 
 
 
 
 
 
 
 
 
 
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!
總結
以上是生活随笔為你收集整理的android opengl es 粒子效果实例代码的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 做毕设时遇到的一些问题,以及一些小技巧
- 下一篇: Reporting Service 钻取
