Android OpenGL | ES给立方体进行纹理映射

看到了 Android OpenGL开发四棱锥和立方体之后,我们是不是增加了使用OpenGL开发图形的兴趣啊,呵呵,希望大家保持热情啊,今天我们接着给已经画好的立方体进行文理处理,效果图如下:

可以看到,我们对正方体做了如下处理:

具体如何实现,我们接着看~~~

Java代码
  1. //当窗口被创建时我们可以做些初始化工作
  2. @Override
  3. publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
  4. //TODOAuto-generatedmethodstub
  5. //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值
  6. gl.glClearColor(0,0,0,0);
  7. gl.glEnable(GL10.GL_CULL_FACE);
  8. //启用阴影平滑
  9. gl.glShadeModel(GL10.GL_SMOOTH);
  10. gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试
  11. //以下是关于深度缓存的设置,非常重要
  12. gl.glClearDepthf(1.0f);//设置深度缓存
  13. gl.glDepthFunc(GL10.GL_LEQUAL);//所做深度测试的类型
  14. //告诉系统对透视进行修正
  15. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
  16. //允许2D贴图
  17. gl.glEnable(GL10.GL_TEXTURE_2D);
  18. IntBufferintBuffer=IntBuffer.allocate(1);
  19. //创建纹理
  20. gl.glGenTextures(1,intBuffer);
  21. texture=intBuffer.get();
  22. //设置需要使用的纹理
  23. gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
  24. Bitmapbmp=BitmapFactory.decodeResource(getResources(),R.drawable.test);
  25. //生成纹理
  26. GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0);
  27. //线形滤波
  28. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
  29. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
  30. }

在onSurfaceChanged方法中,我们需要做一些处理,主要有如下两个方法:

Java代码
  1. //创建纹理
  2. gl.glGenTextures(1,intBuffer);

这个方法是主要用来创建一个文理,参数1表示数量1,参数intBuffer是文理代号;

Java代码
  1. gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
  2. Bitmapbmp=BitmapFactory.decodeResource(getResources(),R.drawable.test);
  3. //生成纹理
  4. GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0);
  5. //线形滤波
  6. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
  7. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
  8. }
  9. 接着绑定需要该纹理的target,在onSurfaceChanged方法之后,我们再在onDrawFrame方法中着色和旋转,完全代码如下:
  10. packageorg.ourunix.android.opengltest;
  11. importjava.nio.ByteBuffer;
  12. importjava.nio.ByteOrder;
  13. importjava.nio.IntBuffer;
  14. importjavax.microedition.khronos.egl.EGLConfig;
  15. importjavax.microedition.khronos.opengles.GL10;
  16. importandroid.app.Activity;
  17. importandroid.graphics.Bitmap;
  18. importandroid.graphics.BitmapFactory;
  19. importandroid.opengl.GLSurfaceView;
  20. importandroid.opengl.GLUtils;
  21. importandroid.opengl.GLSurfaceView.Renderer;
  22. importandroid.os.Bundle;
  23. publicclassOpenGLTestActivityextendsActivity{
  24. /**Calledwhentheactivityisfirstcreated.*/
  25. @Override
  26. publicvoidonCreate(BundlesavedInstanceState){
  27. super.onCreate(savedInstanceState);
  28. GLSurfaceViewglView=newGLSurfaceView(this);
  29. glView.setRenderer(newGLRender());
  30. setContentView(glView);
  31. }
  32. publicclassGLRenderimplementsRenderer{
  33. privateinttexture=-1;
  34. privateintone=0x10000;
  35. privateint[]quarter={-one,-one,one,
  36. one,-one,one,
  37. one,one,one,
  38. -one,one,one,
  39. -one,-one,-one,
  40. -one,one,-one,
  41. one,one,-one,
  42. one,-one,-one,
  43. -one,one,-one,
  44. -one,one,one,
  45. one,one,one,
  46. one,one,-one,
  47. -one,-one,-one,
  48. one,-one,-one,
  49. one,-one,one,
  50. -one,-one,one,
  51. one,-one,-one,
  52. one,one,-one,
  53. one,one,one,
  54. one,-one,one,
  55. -one,-one,-one,
  56. -one,-one,one,
  57. -one,one,one,
  58. -one,one,-one,};
  59. privateint[]texCoords={one,0,0,0,0,one,one,one,
  60. 0,0,0,one,one,one,one,0,
  61. one,one,one,0,0,0,0,one,
  62. 0,one,one,one,one,0,0,0,
  63. 0,0,0,one,one,one,one,0,
  64. one,0,0,0,0,one,one,one,};
  65. //准备正方体顶点
  66. privateIntBufferquarterBuffer=BufferUtil.iBuffer(quarter);
  67. //纹理映射数据
  68. privateIntBuffertexCoordsBuffer=BufferUtil.iBuffer(texCoords);
  69. ByteBufferindicesBuffer=ByteBuffer.wrap(newbyte[]{
  70. 0,1,3,2,
  71. 4,5,7,6,
  72. 8,9,11,10,
  73. 12,13,15,14,
  74. 16,17,19,18,
  75. 20,21,23,22,
  76. });
  77. privatefloatrotateX;//用于正方体x轴的旋转;
  78. privatefloatrotateY;//用于正方体y轴的旋转;
  79. privatefloatrotateZ;//用于正方体z轴的旋转;
  80. //咳,咳现在开始画图了
  81. @Override
  82. publicvoidonDrawFrame(GL10gl){
  83. //TODOAuto-generatedmethodstub
  84. //清楚屏幕和深度缓存
  85. gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
  86. //重置当前的观察模型矩阵
  87. gl.glLoadIdentity();
  88. //现将屏幕向里移动,用来画正方体
  89. gl.glTranslatef(0.0f,0.0f,-6.0f);
  90. //设置3个方向的旋转
  91. gl.glRotatef(rotateX,1.0f,0.0f,0.0f);
  92. gl.glRotatef(rotateY,0.0f,1.0f,0.0f);
  93. gl.glRotatef(rotateZ,0.0f,0.0f,1.0f);
  94. //通知opnegl将文理名字texture绑定到指定的纹理目标上GL10.GL_TEXTURE_2D
  95. gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
  96. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  97. //纹理的使用与开启颜色渲染一样,需要开启纹理功能
  98. gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  99. //设置正方体各顶点
  100. gl.glVertexPointer(3,GL10.GL_FIXED,0,quarterBuffer);
  101. gl.glTexCoordPointer(2,GL10.GL_FIXED,0,texCoordsBuffer);
  102. //绘制
  103. gl.glDrawElements(GL10.GL_TRIANGLE_STRIP,24,GL10.GL_UNSIGNED_BYTE,indicesBuffer);
  104. gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  105. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  106. rotateX+=0.5f;
  107. rotateY+=0.6f;
  108. rotateZ+=0.3f;
  109. }
  110. //当窗口改变时,调用,至少在创建窗口时调用一次,这边设置下场景大小
  111. @Override
  112. publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
  113. //TODOAuto-generatedmethodstub
  114. //设置OpenGL场景大小
  115. floatratio=(float)width/height;
  116. gl.glViewport(0,0,width,height);
  117. gl.glMatrixMode(GL10.GL_PROJECTION);//设置为投影矩阵模式
  118. gl.glLoadIdentity();//重置
  119. gl.glFrustumf(-ratio,ratio,-1,1,1,10);//设置视角
  120. gl.glMatrixMode(GL10.GL_MODELVIEW);
  121. gl.glLoadIdentity();
  122. }
  123. //当窗口被创建时我们可以做些初始化工作
  124. @Override
  125. publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
  126. //TODOAuto-generatedmethodstub
  127. //设置清除屏幕时所用的颜色,参数依次为红、绿、蓝、Alpha值
  128. gl.glClearColor(0,0,0,0);
  129. gl.glEnable(GL10.GL_CULL_FACE);
  130. //启用阴影平滑
  131. gl.glShadeModel(GL10.GL_SMOOTH);
  132. gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试
  133. //以下是关于深度缓存的设置,非常重要
  134. gl.glClearDepthf(1.0f);//设置深度缓存
  135. gl.glDepthFunc(GL10.GL_LEQUAL);//所做深度测试的类型
  136. //告诉系统对透视进行修正
  137. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
  138. //允许2D贴图
  139. gl.glEnable(GL10.GL_TEXTURE_2D);
  140. IntBufferintBuffer=IntBuffer.allocate(1);
  141. //创建纹理
  142. gl.glGenTextures(1,intBuffer);
  143. texture=intBuffer.get();
  144. //设置需要使用的纹理
  145. gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
  146. Bitmapbmp=BitmapFactory.decodeResource(getResources(),R.drawable.test);
  147. //生成纹理
  148. GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0);
  149. //线形滤波
  150. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
  151. gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
  152. }
  153. }
  154. publicstaticclassBufferUtil{
  155. publicstaticIntBufferintBuffer;
  156. publicstaticIntBufferiBuffer(int[]a){
  157. //先初始化buffer,数组的长度*4,因为一个float占4个字节
  158. ByteBuffermbb=ByteBuffer.allocateDirect(a.length*4);
  159. //数组排列用nativeOrder
  160. mbb.order(ByteOrder.nativeOrder());
  161. intBuffer=mbb.asIntBuffer();
  162. intBuffer.put(a);
  163. intBuffer.position(0);
  164. returnintBuffer;
  165. }
  166. }
  167. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值