日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android opengl es 粒子效果实例代码

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android opengl es 粒子效果实例代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述:粒子系統(tǒng)采用許多形狀簡(jiǎn)單的微小粒子作為基本元素,用它們來表示不規(guī)則模糊物體,系統(tǒng)中的每個(gè)粒子都有各自的生命周期,我們可以管理它們從創(chuàng)建到消亡的時(shí)間,它們都要經(jīng)歷“產(chǎn)生”、“運(yùn)動(dòng)”、“消亡”這三個(gè)階段。

下面我們做個(gè)簡(jiǎn)單的粒子效果,但感覺我做的效果跟原先想象的,有點(diǎn)不一樣,還得繼續(xù)改進(jìn),呵呵。

代碼如下:


1、Activity類代碼

import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle;public class ParticleOpenglActivity extends Activity {GLSurfaceView gView;private ParticleRenderer particleRenderer;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initBitmap.init(this.getResources());gView = new GLSurfaceView(this);particleRenderer = new ParticleRenderer();gView.setRenderer(particleRenderer);setContentView(gView);} }

2、bitmap初始化類

import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /*** 將圖片轉(zhuǎn)成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; //是否激活狀態(tài)float live;//粒子生命float fade; //衰減速度float r; //紅色值float g; //綠色值float b; //藍(lán)色值//變量x.y和z控制粒子在屏幕上顯示的位置.float x; //x位置float y; //y位置float z; //z位置//這三個(gè)變量控制粒子在每個(gè)軸上移動(dòng)的快慢和方向.如果xi是負(fù)價(jià)粒//子將會(huì)向左移動(dòng),正值將會(huì)向右移動(dòng).float xi; // x方向float yi; // y方向float zi; // z方向/*** 每一個(gè)變量可被看成加速度.如果xg正值時(shí),粒子將會(huì)被拉倒右邊,負(fù)值* 將拉向左邊.所以如果粒子向左移動(dòng)(負(fù)的)而我們給它一個(gè)正的加速度,粒子速度將變慢.*/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;/*** 粒子系統(tǒng)效果實(shí)現(xiàn)類** 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; //最大數(shù)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 ; //循環(huán)變量private int color; //當(dāng)前的顏色private int delay; //彩虹效果延遲private Random random = new Random();//創(chuàng)建一個(gè)粒子數(shù)組private Particle particles[] = new Particle[MAX_PARTICLE];//存儲(chǔ)12中不同的顏色.對(duì)每一個(gè)顏色從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);}//隨機(jī)生成0~999數(shù)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];// 在粒子從新設(shè)置之后,將給它新的移動(dòng)速度/方向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);//頂點(diǎn)和紋理設(shè)置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則在原視角基礎(chǔ)上加上zoomfloat z = particles[loop].z + zoom;// 設(shè)置粒子顏色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);//我們也重新設(shè)定粒子在屏幕中心放置.我們重新設(shè)定粒子的x,y和z位置為零particles[loop].x += particles[loop].xi / (slowdown * 1000);// 更新Y坐標(biāo)的位置particles[loop].y += particles[loop].yi / (slowdown * 1000);// 更新Z坐標(biāo)的位置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;//我們也重新設(shè)定粒子在屏幕中心放置.我們重新設(shè)定粒子的x,y和z位置為零particles[loop].x = 0.0f;particles[loop].y = 0.0f;particles[loop].z = 0.0f;//在粒子從新設(shè)置之后,將給它新的移動(dòng)速度/方向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) {// 設(shè)置場(chǎng)景大小gl.glViewport(0, 0, width, height);if (height == 0) {height = 1;}float ratio = (float) width / height;// 投影矩陣gl.glMatrixMode(GL10.GL_PROJECTION);// 重置視圖gl.glLoadIdentity();// 設(shè)置視圖的大小gl.glFrustumf(-ratio, ratio, -1, 1, 1, 200);// 設(shè)置觀察模型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);// 注意:關(guān)閉深度測(cè)試gl.glDisable(GL10.GL_DEPTH_TEST);//啟用混合 gl.glEnable(GL10.GL_BLEND);// 啟用紋理gl.glEnable(GL10.GL_TEXTURE_2D);// 創(chuàng)建紋理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);//放大時(shí)gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);//縮小時(shí) /*** 初始化所有的粒子*/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;//隨機(jī)生成衰減速率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、運(yùn)行效果:












新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的android opengl es 粒子效果实例代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一区二区免费 | xxxxx国产| 四季av一区二区三区免费观看 | 国内精品嫩模av私拍在线观看 | 国产免费91 | 在线网站黄 | 欧美成人国产 | 小镇姑娘国语版在线观看免费 | 黄页视频在线免费观看 | 久久久午夜精品福利内容 | 国产精品成久久久久三级 | 欧美三区在线观看 | 欧美日韩激情一区 | 欧美一级片在线播放 | 中文字幕一区二区三区在线不卡 | 神马午夜久久 | 波多野结衣免费在线视频 | 伊人超碰在线 | 日本激情视频网站 | 亚洲天堂资源在线 | 久久a毛片 | 午夜免费福利在线观看 | 久久草精品 | 一区二区在线观看免费 | 五月天六月婷婷 | 87福利视频 | 欧美无玛 | 亚洲国产精品久久久久婷婷老年 | 中文字幕乱码一区二区 | 亚洲第六页 | 水蜜桃影库 | 91精品小视频 | 午夜av剧场| 日韩天堂视频 | 日韩一区不卡 | 亚洲国产精品成人午夜在线观看 | 中文字幕免费在线看线人动作大片 | 丰满岳跪趴高撅肥臀尤物在线观看 | 亚洲国产成人va在线观看天堂 | 成人在线综合 | 日韩喷潮| 精品国产av一区二区三区 | 女人下面无遮挡 | 情侣av| 国产黄站 | 男女猛烈无遮挡免费视频 | 毛片入口| 欧美三级视频在线 | 在线二区| 久久久新 | 女人av在线 | 亚洲一二区在线 | 久久成人综合网 | 黄页av | 欣赏asian国模裸体pics | 欧美天堂一区 | 先锋影音制服丝袜 | 日本一区二区高清不卡 | 亚洲精品一区二区三区四区 | 福利视频h | 清冷男神被c的合不拢腿男男 | 一级片免费网站 | 亚洲www久久久 | 日韩一级片 | 狠狠躁狠狠躁视频专区 | 国产av成人一区二区三区高清 | 久久久久香蕉 | 亚洲乱码国产乱码精品精 | 在线黄色av | 亚洲无毛 | 伊人久久精品视频 | 日本高清www免费视频 | 茄子视频色| 亚洲国产欧美另类 | 久久女女 | av在线免播放器 | 视频区小说区图片区 | 国产一级黄色av | 欧美日韩国产成人在线 | 国产人免费人成免费视频 | 一边摸一边抽搐一进一出视频 | 欧美另类极品videosbest使用方法 | 少妇高潮网站 | 国语对白真实视频播放 | av激情四射 | 国产一区二区三区影视 | 九草av | 超碰美女| 欧美双性人妖o0 | 六月综合网 | 日本三级韩国三级美三级91 | 男人的天堂手机在线 | 美女一二区 | 天天操一操 | 狠狠躁日日躁夜夜躁2022麻豆 | 性综合网 | 日本亚洲高清 | xxx性欧美| 麻豆一区二区在线观看 |