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.}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值