免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2691 | 回复: 1
打印 上一主题 下一主题

android系统下使用openGL开发demo [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-02 17:17 |只看该作者 |倒序浏览
android系统下使用openGL开发demo










对openGL早有耳闻,但是刚接触android下的opengl,做个demo学习下,


先把opengl的框架搭建起来:只要有如下几个文件,


openActivity.java     ----作为启动入口,android通过GLSurfaceView显示openGL试图,而GLSurfaceView提供了专门渲染3D的Renderer接口

GLRender.java ----渲染图形



GLImage.java  ----获取资源文件


GLRender.java  实现Renderer接口:只要实现如下方法:
  1. public void onDrawFrame(GL10 gl); //进行图形的绘制

  2. public void onSurfaceChanged(GL10 gl, int width, int height);

  3. public void onSurfaceCreated(GL10 gl, EGLConfig config);


  4. GLRender.java 代码如下:
  5. package com.aurora.android.render;

  6. import java.nio.ByteBuffer;
  7. import java.nio.IntBuffer;
  8. import java.util.Random;

  9. import javax.microedition.khronos.egl.EGLConfig;
  10. import javax.microedition.khronos.opengles.GL10;

  11. import com.aurora.android.model.GLImage;
  12. import com.aurora.android.model.Star;


  13. import android.opengl.GLUtils;
  14. import android.opengl.GLSurfaceView.Renderer;
  15. import android.view.KeyEvent;

  16. public class GLRender implements Renderer {

  17. public static final int num = 50;
  18. public Star[] star = new Star[num];
  19. Random random = new Random();
  20. boolean key;
  21. boolean twinkle = true;
  22. float spin;
  23. float zoom = -10.0f;
  24. float tilt = 90.0f;
  25. int texture;

  26. int one = 0x10000;

  27.         //纹理数据
  28. IntBuffer coords = IntBuffer.wrap(new int[] {
  29. 0, 0,
  30. one, 0,
  31. one, one,
  32. 0,one });

  33. IntBuffer vertexs = IntBuffer.wrap(new int[] {
  34. -one, -one, 0,
  35. one, -one, 0,
  36. one, one, 0,
  37. -one, one, 0 });

  38. ByteBuffer indices = ByteBuffer.wrap(new byte[] {
  39. 1, 0, 2, 3
  40. });

  41. @Override
  42. public void onDrawFrame(GL10 gl) {
  43. // TODO Auto-generated method stub

  44. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  45. gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);//绑定纹理

  46. for (int i = 0; i < num; i++) {
  47. gl.glLoadIdentity();

  48. gl.glTranslatef(0.0f, 0.0f, zoom);
  49. gl.glRotatef(tilt, 1.0f, 0.0f, 0.0f);
  50. gl.glRotatef(star[i].angle, 0.0f, 1.0f, 0.0f);
  51. gl.glTranslatef(star[i].dist, 0.0f, 0.0f);
  52. gl.glRotatef(-star[i].angle, 0.0f, 1.0f, 0.0f);
  53. gl.glRotatef(-tilt, 1.0f, 0.0f, 0.0f);

  54. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//启用顶点
  55. gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//启用着色
  56. gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);//启用纹理

  57. if (twinkle) {//启用星星闪烁效果
  58.                                 //使用byte型数值指定一颜色
  59. gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,
  60. (float) star[(num - i) - 1].g / 255.0f,
  61. (float) star[(num - i) - 1].b / 255.0f, 1.0f);
  62. gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs);
  63. gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coords);

  64. {
  65. coords.position(0);
  66. vertexs.position(0);
  67. indices.position(0);
  68.                                         //绘图
  69. gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4,
  70. GL10.GL_UNSIGNED_BYTE, indices);

  71. }
  72.                                 //闪烁星星绘制完成
  73. gl.glFinish();
  74. }
  75.                         //绕z轴旋转
  76. gl.glRotatef(spin, 0.0f, 0.0f, 1.0f);

  77. gl.glColor4f((float) star[(num - i) - 1].r / 255.0f,
  78. (float) star[(num - i) - 1].g / 255.0f,
  79. (float) star[(num - i) - 1].b / 255.0f, 1.0f);
  80. gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertexs);
  81. gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, coords);

  82. {
  83. coords.position(0);
  84. vertexs.position(0);
  85. indices.position(0);

  86. gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4,
  87. GL10.GL_UNSIGNED_BYTE, indices);

  88. }
  89. gl.glFinish();

  90. gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
  91. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  92. gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

  93. spin += 0.01f;
  94. star[i].angle += (float) (i) / (float) num;
  95. star[i].dist -= 0.01f;
  96. if (star[i].dist < 0.0f) {
  97. star[i].dist += 5.0f;
  98. star[i].r = random.nextInt(256);
  99. star[i].g = random.nextInt(256);
  100. star[i].b = random.nextInt(256);
  101. }
  102. }

  103. }

  104. @Override
  105. public void onSurfaceChanged(GL10 gl, int width, int height) {
  106. // TODO Auto-generated method stub
  107. float ratio = (float) width / height;
  108. gl.glViewport(0, 0, width, height);// 设置场景大小
  109. gl.glMatrixMode(GL10.GL_PROJECTION);// 设置投影矩阵
  110. gl.glLoadIdentity();
  111. gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);// 设置视口大小
  112. gl.glMatrixMode(GL10.GL_MODELVIEW);// 设置观察模式
  113. gl.glLoadIdentity();
  114. }

  115. @Override
  116. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  117. // TODO Auto-generated method stub

  118. gl.glShadeModel(GL10.GL_SMOOTH);// 启用平滑
  119. gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 设置黑背景
  120. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 精细的透视修正

  121. IntBuffer intBuffer = IntBuffer.allocate(1);
  122. gl.glGenTextures(1, intBuffer);
  123. texture = intBuffer.get();

  124. gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
  125. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
  126. GL10.GL_LINEAR);
  127. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
  128. GL10.GL_LINEAR);
  129. GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap, 0);

  130. gl.glEnable(GL10.GL_TEXTURE_2D);// 设置纹理
  131. gl.glShadeModel(GL10.GL_SMOOTH);// 启用平滑
  132. gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 设置黑背景
  133. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);// 精细的透视修正
  134. gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);// 设置混合函数取半透明
  135. gl.glEnable(GL10.GL_BLEND);// 设置混色

  136. for (int i = 0; i < num; i++) {

  137. Star starTemp = new Star();
  138. starTemp.angle = 0.0f;
  139. starTemp.dist = ((float) (i) / (float) num) * 5.0f;

  140. starTemp.r = random.nextInt(256);
  141. starTemp.g = random.nextInt(256);
  142. starTemp.b = random.nextInt(256);
  143. star[i] = starTemp;

  144. }
  145. }

  146. public boolean onKeyUp(int keyCode, KeyEvent event) {
  147. twinkle = !twinkle;
  148. return false;
  149. }
  150. }

  151. openActivity.java代码如下:
  152. package com.aurora.android.advanced;

  153. import com.aurora.android.model.GLImage;
  154. import com.aurora.android.render.GLRender;

  155. import android.app.Activity;
  156. import android.opengl.GLSurfaceView;
  157. import android.os.Bundle;
  158. import android.view.KeyEvent;

  159. public class OpenActivity extends Activity {
  160. GLRender render = new GLRender();

  161.     /** Called when the activity is first created. */
  162.     @Override
  163.     public void onCreate(Bundle savedInstanceState) {
  164.         super.onCreate(savedInstanceState);
  165.         GLImage.load(this.getResources());
  166.         GLSurfaceView glView = new GLSurfaceView(this);
  167.         glView.setRenderer(render);
  168.         setContentView(glView);
  169.     }
  170.    
  171.     public boolean onKeyUp(int keyCode, KeyEvent event){
  172.     render.onKeyUp(keyCode, event);
  173.     return false;
  174.     }
  175. }

  176. GLImage.java:

  177. package com.aurora.android.model;

  178. import com.aurora.android.advanced.R;

  179. import android.content.res.Resources;
  180. import android.graphics.Bitmap;
  181. import android.graphics.BitmapFactory;

  182. public class GLImage {

  183. public static Bitmap mBitmap;

  184. public static void load(Resources resource){
  185.                 //获取图片资源
  186. mBitmap = BitmapFactory.decodeResource(resource, R.drawable.star);
  187. }
  188. }

  189. Star.java:星星

  190. package com.aurora.android.model;

  191. public class Star {

  192. public int r,g,b; //星星RGB颜色
  193. public float dist;//星星距离中心的距离
  194. public float angle = 0.0f; //当前星星处的角度

  195. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-23 23:34 |只看该作者
谢谢分享  希望于楼主多多交流
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP