`
abc20899
  • 浏览: 908044 次
  • 性别: 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.}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics