初学Android OpenGL ES之使用纹理 八十三

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

在网上发现这些讲纹理的文章,非常不错

android 游戏导引(4. 简单纹理贴图)

http://www.cnblogs.com/shengdoushi/archive/2011/01/13/1934181.html


Android OpenGL es 纹理坐标设定与贴图规则

http://blog.csdn.net/cjkwin/article/details/6016224


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

http://www.ourunix.org/android/post/34.html


这篇的例子也是立方体的纹理,不过是用手指划过让立方体旋转


使用纹理的重要代码如下

  private void loadTexture(GL10 gl)  {   Bitmap bitmap = null;   try   {    // 加载位图    bitmap = BitmapFactory.decodeResource(context.getResources(),     R.drawable.sand);    int[] textures = new int[1];    // 指定生成N个纹理(第一个参数指定生成1个纹理),    // textures数组将负责存储所有纹理的代号。    gl.glGenTextures(1, textures, 0);    // 获取textures纹理数组中的第一个纹理    texture = textures[0];    // 通知OpenGL将texture纹理绑定到GL10.GL_TEXTURE_2D目标中    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);    // 设置纹理被缩小(距离视点很远时被缩小)时候的滤波方式    gl.glTexParameterf(GL10.GL_TEXTURE_2D,     GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);    // 设置纹理被放大(距离视点很近时被方法)时候的滤波方式    gl.glTexParameterf(GL10.GL_TEXTURE_2D,     GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);    // 设置在横向、纵向上都是平铺纹理    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,     GL10.GL_REPEAT);    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,     GL10.GL_REPEAT);    // 加载位图生成纹理    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);   }   finally   {    // 生成纹理之后,回收位图    if (bitmap != null)     bitmap.recycle();   }  }

纹理的装载则是在方法void onSurfaceCreated(GL10 gl, EGLConfig config) 中

在Renderer的 void onDrawFrame(GL10 gl)方法中要启用纹理的数组数据,坐标数据,执行纹理贴图

   // 启用贴图座标数组数据   gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   // 设置贴图的的座标数据   gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);   // 执行纹理贴图   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

完整代码如下

public class Texture3D extends Activity implements OnGestureListener// 定义旋转角度 private float anglex = 0fprivate float angley = 0fstatic final float ROTATE_FACTOR = 60// 定义手势检测器实例 GestureDetector detector; @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  // 创建一个GLSurfaceView,用于显示OpenGL绘制的图形  GLSurfaceView glView = new GLSurfaceView(this);  // 创建GLSurfaceView的内容绘制器  MyRenderer myRender = new MyRenderer(this);  // 为GLSurfaceView设置绘制器  glView.setRenderer(myRender);  setContentView(glView);  // 创建手势检测器  detector = new GestureDetector(this); } @Override public boolean onTouchEvent(MotionEvent me) {  // 将该Activity上的触碰事件交给GestureDetector处理  return detector.onTouchEvent(me); } @Override public boolean onFling(MotionEvent event1, MotionEvent event2,  float velocityX, float velocityY) {  velocityX = velocityX > 4000 ? 4000 : velocityX;  velocityX = velocityX < -4000 ? -4000 : velocityX;  velocityY = velocityY > 4000 ? 4000 : velocityY;  velocityY = velocityY < -4000 ? -4000 : velocityY;  // 根据横向上的速度计算沿Y轴旋转的角度  angley += velocityX * ROTATE_FACTOR / 4000;  // 根据纵向上的速度计算沿X轴旋转的角度  anglex += velocityY * ROTATE_FACTOR / 4000;  return true; } @Override public boolean onDown(MotionEvent arg0) {  return false; } @Override public void onLongPress(MotionEvent event) { } @Override public boolean onScroll(MotionEvent event1, MotionEvent event2,  float distanceX, float distanceY) {  return false; } @Override public void onShowPress(MotionEvent event) { } @Override public boolean onSingleTapUp(MotionEvent event) {  return false; } public class MyRenderer implements Renderer {  // 立方体的顶点座标(一共是36个顶点,组成12个三角形)  private float[] cubeVertices = { -0.6f, -0.6f, -0.6f, -0.6f, 0.6f,   -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, -0.6f, -0.6f,   -0.6f, -0.6f, -0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f,   0.6f, 0.6f, 0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f,   0.6f, -0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, 0.6f,   0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, -0.6f, 0.6f,   -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f,   0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f,   -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, 0.6f,   0.6f, 0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, -0.6f,   -0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, 0.6f, 0.6f,   -0.6f, 0.6f, -0.6f, };  // 定义立方体所需要的6个面(一共是12个三角形所需的顶点)  private byte[] cubeFacets = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,   30, 31, 32, 33, 34, 35, };  // 定义纹理贴图的座标数据  private float[] cubeTextures = { 1.0000f, 1.0000f, 1.0000f, 0.0000f,   0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f, 1.0000f,   1.0000f, 0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f,   1.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f, 0.0000f,   1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f, 1.0000f, 0.0000f,   0.0000f, 0.0000f, 0.0000f, 1.0000f, 0.0000f, 1.0000f, 1.0000f,   1.0000f, 1.0000f, 0.0000f, 1.0000f, 0.0000f, 0.0000f, 0.0000f,   0.0000f, 1.0000f, 0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f,   0.0000f, 1.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f,   0.0000f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.0000f, 1.0000f,   0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f };  private Context context;  private FloatBuffer cubeVerticesBuffer;  private ByteBuffer cubeFacetsBuffer;  private FloatBuffer cubeTexturesBuffer;  // 定义本程序所使用的纹理  private int texture;  public MyRenderer(Context main)  {   this.context = main;   // 将立方体的顶点位置数据数组包装成FloatBuffer;   cubeVerticesBuffer = FloatBuffer.wrap(cubeVertices);   // 将立方体的6个面(12个三角形)的数组包装成ByteBuffer   cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);   // 将立方体的纹理贴图的座标数据包装成FloatBuffer   cubeTexturesBuffer = FloatBuffer.wrap(cubeTextures);  }  @Override  public void onSurfaceCreated(GL10 gl, EGLConfig config)  {   // 关闭抗抖动   gl.glDisable(GL10.GL_DITHER);   // 设置系统对透视进行修正   gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);   gl.glClearColor(0, 0, 0, 0);   // 设置阴影平滑模式   gl.glShadeModel(GL10.GL_SMOOTH);   // 启用深度测试   gl.glEnable(GL10.GL_DEPTH_TEST);   // 设置深度测试的类型   gl.glDepthFunc(GL10.GL_LEQUAL);   // 启用2D纹理贴图   gl.glEnable(GL10.GL_TEXTURE_2D);   // 装载纹理   loadTexture(gl);  }  @Override  public void onSurfaceChanged(GL10 gl, int width, int height)  {   // 设置3D视窗的大小及位置   gl.glViewport(0, 0, width, height);   // 将当前矩阵模式设为投影矩阵   gl.glMatrixMode(GL10.GL_PROJECTION);   // 初始化单位矩阵   gl.glLoadIdentity();   // 计算透视视窗的宽度、高度比   float ratio = (float) width / height;   // 调用此方法设置透视视窗的空间大小。   gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);  }  public void onDrawFrame(GL10 gl)  {   // 清除屏幕缓存和深度缓存   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   // 启用顶点座标数据   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   // 启用贴图座标数组数据   gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   // 设置当前矩阵模式为模型视图。   gl.glMatrixMode(GL10.GL_MODELVIEW);   // --------------------绘制第一个图形---------------------   gl.glLoadIdentity();   // 把绘图中心移入屏幕2个单位   gl.glTranslatef(0f, 0.0f, -2.0f);   // 旋转图形   gl.glRotatef(angley, 0, 1, 0);   gl.glRotatef(anglex, 1, 0, 0);   // 设置顶点的位置数据   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);   // 设置贴图的的座标数据   gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, cubeTexturesBuffer);   // 执行纹理贴图   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);   // 按cubeFacetsBuffer指定的面绘制三角形   gl.glDrawElements(GL10.GL_TRIANGLES, cubeFacetsBuffer.remaining(),    GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);   // 绘制结束   gl.glFinish();   // 禁用顶点、纹理座标数组   gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);   gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   // 递增角度值以便每次以不同角度绘制  }  private void loadTexture(GL10 gl)  {   Bitmap bitmap = null;   try   {    // 加载位图    bitmap = BitmapFactory.decodeResource(context.getResources(),     R.drawable.sand);    int[] textures = new int[1];    // 指定生成N个纹理(第一个参数指定生成1个纹理),    // textures数组将负责存储所有纹理的代号。    gl.glGenTextures(1, textures, 0);    // 获取textures纹理数组中的第一个纹理    texture = textures[0];    // 通知OpenGL将texture纹理绑定到GL10.GL_TEXTURE_2D目标中    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);    // 设置纹理被缩小(距离视点很远时被缩小)时候的滤波方式    gl.glTexParameterf(GL10.GL_TEXTURE_2D,     GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);    // 设置纹理被放大(距离视点很近时被方法)时候的滤波方式    gl.glTexParameterf(GL10.GL_TEXTURE_2D,     GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);    // 设置在横向、纵向上都是平铺纹理    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,     GL10.GL_REPEAT);    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,     GL10.GL_REPEAT);    // 加载位图生成纹理    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);   }   finally   {    // 生成纹理之后,回收位图    if (bitmap != null)     bitmap.recycle();   }  } }}



           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值