萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> Android OpenGL ES 紋理映射之glDrawElements

Android OpenGL ES 紋理映射之glDrawElements

  目標: 為四方體的每個面貼上一張圖片,並自動旋轉。

  一、基礎知識:

  要實現每個面上貼一張圖片,首先需要創建一個紋理,並使用圖片來生成一個紋理。

  ==========================================================================

  1.初始化:

  IntBuffer intBuffer = IntBuffer.allocate(2);

  // 1.允許2D貼圖,紋理

  gl.glEnable(GL10.GL_TEXTURE_2D);

  // 2.創建紋理

  gl.glGenTextures(2, intBuffer);

  texture = intBuffer.get(0);

  // 3.設置要使用的紋理

  gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

  // 4.生成紋理

  GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.close_Bitmap, 0);

  // 5.線形濾波

  gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);

  gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

  ==========================================================================

  2.使用:

  // 1.清除屏幕和深度緩存

  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  // 2.重置當前的模型觀察矩陣

  gl.glLoadIdentity();

  // 3.移動到指定的位置

  gl.glTranslatef(0.0f, 0.0f, -5.0f);

  // 4.設置3個方向的旋轉

  gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);

  gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

  gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);

  texture = intBuffer.get(1);;

  // 5.綁定紋理

  gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);

  // 6.開啟頂點和紋理功能

  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

  gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

  // 7.紋理和四邊形對應的頂點

  gl.glVertexPointer(3, GL10.GL_FIXED, 0, vertices);

  gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, texCoords);

  // 8.繪制0

  GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.iBitmap, 0);

  gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE, indices_0);

  // 9.關閉頂點和紋理功能

  gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

  ==========================================================================

  二、實現:

  1. 界面編輯:

  【reslayoutmain.xml】

  [html]

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/hello"

  />

  

  android:id="@+id/button1"

  android:layout_width="145dp"

  android:layout_height="wrap_content"

  android:text="演示開始" />

  

  

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/hello"

  />

  

  android:id="@+id/button1"

  android:layout_width="145dp"

  android:layout_height="wrap_content"

  android:text="演示開始" />

  

  2.代碼編輯:

  【srccomyarinandroidExamplesActivity01.java】

  [java]

  package com.yarin.android.Examples_12_05;

  import java.io.IOException;

  import java.io.InputStream;

  import javax.microedition.khronos.opengles.GL10;

  import android.app.Activity;

  import android.content.res.Resources;

  import android.graphics.Bitmap;

  import android.graphics.BitmapFactory;

  import android.opengl.GLSurfaceView;

  import android.opengl.GLUtils;

  import android.opengl.GLSurfaceView.Renderer;

  import android.os.Bundle;

  import android.view.View;

  import android.widget.Button;

  public class Activity01 extends Activity

  {

  Renderer render = new GLRender();

  GLSurfaceView glView;

  Button start; // 演示開始

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

  super.onCreate(savedInstanceState);

  GLImage.load(this.getResources());

  glView = new GLSurfaceView(this);

  glView.setRenderer(render);

  setContentView(R.layout.main);

  start=(Button)findViewById(R.id.button1); // "演示開始"按鈕初始化

  start.setOnClickListener(new View.OnClickListener() {

  @Override

  public void onClick(View v) {

  // TODO Auto-generated method stub

  setContentView(glView);

  }

  });

  //setContentView(glView);

  }

  }

  class GLImage

  {

  public static Bitmap iBitmap;

  public static Bitmap jBitmap;

  public static Bitmap kBitmap;

  public static Bitmap lBitmap;

  public static Bitmap mBitmap;

  public static Bitmap nBitmap;

  public static Bitmap close_Bitmap;

  public static void load(Resources resources)

  {

  iBitmap = BitmapFactory.decodeResource(resources, R.drawable.img);

  jBitmap = BitmapFactory.decodeResource(resources, R.drawable.jmg);

  kBitmap = BitmapFactory.decodeResource(resources, R.drawable.kmg);

  lBitmap = BitmapFactory.decodeResource(resources, R.drawable.lmg);

  mBitmap = BitmapFactory.decodeResource(resources, R.drawable.mmg);

  nBitmap = BitmapFactory.decodeResource(resources, R.drawable.nmg);

  close_Bitmap = BitmapFactory.decodeResource(resources, R.drawable.close);

  }

  }

  【srccomyarinandroidExamplesGLRender.java】

  package com.yarin.android.Examples_12_05;

  import java.io.IOException;

  import java.io.InputStream;

  import java.nio.ByteBuffer;

  import java.nio.IntBuffer;

  import javax.microedition.khronos.egl.EGLConfig;

  import javax.microedition.khronos.opengles.GL10;

  import android.graphics.Bitmap;

  import android.graphics.BitmapFactory;

  import android.opengl.GLUtils;

  import android.opengl.GLSurfaceView.Renderer;

  public class GLRender implements Renderer

  {

  float xrot, yrot, zrot;

  int texture = -1;

  int one = 0x10000;

  IntBuffer intBuffer = IntBuffer.allocate(2);

  int n_view_start_x=100;

  int n_view_start_y=20;

  int n_close_flag=0; // 1: close_icon show. 0: close_icon hide.

  public int textureId;

  IntBuffer vertices = IntBuffer.wrap(new int[]{

  -one,-one,one,

  one,-one,one,

  one,one,one,

  -one,one,one,

  -one,-one,-one,

  -one,one,-one,

  one,one,-on

copyright © 萬盛學電腦網 all rights reserved