`
wo_deqing
  • 浏览: 64205 次
文章分类
社区版块
存档分类
最新评论

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. }
分享到:
评论

相关推荐

    Android OpenGL实现立方体多纹理图片映射

    本教程将深入探讨如何使用OpenGL ES在Android中实现立方体的多纹理映射以及混色光照效果,这对于游戏开发、虚拟现实应用以及其他需要动态图形的场景至关重要。 首先,我们需要了解纹理映射的概念。纹理映射是将2D...

    Android代码-OpenGL3D立方体多纹理贴图源码.zip

    这个“Android代码-OpenGL3D立方体多纹理贴图源码.zip”文件显然包含了实现3D立方体并应用多纹理贴图的示例代码,对于学习Android平台上的3D图形编程非常有帮助。 1. **OpenGL基础知识**:在OpenGL中,图形是通过...

    Android OpenGL ES 绘制立方体 球体 圆柱 等几何形状

    Android OpenGL ES 提供了一个接口,让开发者能够利用硬件加速的图形处理能力,来绘制出立方体、球体、圆柱等几何形状。在这个场景中,我们看到描述中提到了几个关键的元素:几何形状类和renderer类。 1. **几何...

    Android应用源码OpenGL 3D立方体多纹理贴图.zip

    本项目"Android应用源码OpenGL 3D立方体多纹理贴图"是一个示例,展示了如何在Android平台上利用OpenGL ES(OpenGL针对嵌入式系统的版本)进行3D图形渲染,并实现多纹理贴图。下面我们将深入探讨其中涉及的关键知识点...

    Android应用源码OpenGL 3D立方体多纹理贴图-IT计算机-毕业设计.zip

    在这个名为“Android应用源码OpenGL 3D立方体多纹理贴图”的项目中,开发者将展示如何在Android应用中利用OpenGL ES实现3D立方体,并进行多纹理贴图。 首先,理解OpenGL ES的基本概念至关重要。OpenGL ES提供了一组...

    【OpenGL ES】立方体贴图(6张图)

    本主题将深入探讨如何在OpenGL ES中实现立方体贴图,这是一种将六个不同图像分别映射到立方体六个面的技术。 立方体贴图是一种特殊的纹理类型,它由六个2D纹理组成,每个2D纹理对应立方体的一个面。这种技术在渲染...

    android opengl 立方体 免费

    总的来说,这个"android opengl 立方体"项目是一个很好的起点,它涵盖了Android OpenGL ES的基础,包括设置环境、创建几何形状、编写和使用着色器、处理顶点数据、纹理映射等关键概念。对于初学者来说,通过实践这个...

    安卓Android源码——OpenGL 3D立方体多纹理贴图.zip

    本项目“安卓Android源码——OpenGL 3D立方体多纹理贴图”着重展示了如何在Android应用中利用OpenGL ES创建一个3D立方体,并为其应用多个纹理贴图。 首先,我们需要理解OpenGL ES的基本概念,如顶点、坐标系统、...

    Android项目OpenGL 3D立方体多纹理贴图.rar

    通过此项目,您可以学习并掌握在Android平台上使用OpenGL ES进行3D图形渲染的基本技巧,包括着色器编程、纹理映射以及变换矩阵的使用等。 项目特点: 1. **多纹理贴图**:立方体的每个面都可以独立加载和显示不同...

    AndroidOpenGL.rar_android_android 立方体_cube_openGL-es android_立方体

    总的来说,"Android OpenGL 立方体旋转"实例是一个基础的3D图形编程教程,涵盖了OpenGL ES的使用、基本的几何体构建、矩阵变换以及动画原理。它为开发者提供了一个理解OpenGL ES工作原理和实践3D图形编程的起点。...

    android opengl es三维立方体源码

    这个“android opengl es三维立方体源码”是一个很好的起点,对于想要学习Android OpenGL ES编程的人来说尤其有用。 首先,我们来理解OpenGL ES的基本概念。OpenGL ES是一个基于图元的图形API,它接受顶点、颜色、...

    android opengles 贴图旋转3D立方体

    在本文中,我们将深入探讨如何使用OpenGL ES在Android应用中实现一个贴图旋转的3D立方体。首先,我们需要理解OpenGL ES的基本概念,然后逐步构建这个示例项目。 1. **OpenGL ES基础知识**: OpenGL ES是基于OpenGL...

    Android OpenGL 3D 立方体多纹理贴图源码.zip

    这个压缩包"Android OpenGL 3D 立方体多纹理贴图源码.zip"提供了一个具体的实例,展示了如何在Android应用中使用OpenGL ES实现3D立方体并进行多纹理贴图。 首先,我们需要理解3D图形的基本概念。一个3D立方体是由六...

    Android OpenGL 3D 立方体多纹理贴图源码.rar

    本资源“Android OpenGL 3D 立方体多纹理贴图源码”是一个关于如何在Android上使用OpenGL ES实现3D立方体并进行多纹理贴图的示例项目。这个项目可以帮助开发者理解如何利用OpenGL ES进行3D图形编程,以及如何处理...

    Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

    在OpenGL ES中,我们首先需要定义立方体的顶点坐标和纹理坐标,顶点坐标确定了立方体的形状,而纹理坐标则告诉OpenGL如何将纹理映射到这些顶点上。 1. **顶点数组**:创建立方体需要六个面的顶点信息,每个面通常由...

    android opengl es 圆锥纹理贴图

    1. **纹理坐标**:每个顶点都有对应的纹理坐标,这些坐标告诉OpenGL ES如何将纹理映射到几何体表面。通常使用UV坐标系,U和V分别对应纹理的水平和垂直方向。 2. **纹理单元**:OpenGL ES支持同时使用多个纹理,每个...

    安卓Android源码——OpenGL3D立方体多纹理贴图源码.zip

    本篇将详细介绍Android环境下使用OpenGL ES进行3D立方体的多纹理贴图的源码解析。 首先,"安卓Android源码——OpenGL3D立方体多纹理贴图源码.zip"这个压缩包包含了一些关键文件。`1_120820210603_1.png`和`1_...

    OpenGL ES之渲染旋转的立方体.zip

    在这个项目中,立方体的每个面都是由多个三角形组成的,这些三角形通过顶点数据定义,并由OpenGL ES进行渲染。 5. **动画(Animation)**:通过不断更新模型视图矩阵,可以实现物体的动态效果,如旋转、平移和缩放...

    安卓Android源码——OpenGL 3D立方体多纹理贴图.rar

    这个"安卓Android源码——OpenGL 3D立方体多纹理贴图.rar"文件显然包含了实现3D立方体并应用多纹理贴图的源代码示例。 在3D图形编程中,纹理贴图是将2D图像覆盖到3D模型表面的技术,为物体增加真实感和细节。在...

Global site tag (gtag.js) - Google Analytics