Android OpenglES 繪製多個紋理

 
  1. import zhou.ne.he.four.FourRend;  
  2. import zhou.ne.he.one.OneRend;  
  3. import zhou.ne.he.thri.ThriRend;  
  4. import zhou.ne.he.two.TwoRend;  
  5. import android.app.Activity;  
  6. import android.opengl.GLSurfaceView;  
  7. import android.os.Bundle;  
  8. import android.view.KeyEvent;  
  9. import android.view.MotionEvent;  
  10.   
  11. public class Run extends Activity {  
  12.   
  13.  private GLSurfaceView gl_view = null;  
  14.  private GLSurfaceView.Renderer gl_rend = null;  
  15.  private float mPreviousX;  
  16.  private float mPreviousY;  
  17.   
  18.  public void onCreate(Bundle savedInstanceState) {  
  19.   super.onCreate(savedInstanceState);  
  20.   gl_view = new GLSurfaceView(this);  
  21. //  gl_rend = new FourRend(this.getApplicationContext());  
  22. //  gl_rend = new OneRend();  
  23. //  gl_rend = new TwoRend();  
  24.   gl_rend = new ThriRend(this.getApplicationContext());  
  25.   gl_view.setRenderer(gl_rend);  
  26.   setContentView(gl_view);  
  27.  }  
  28.   
  29.  public boolean onKeyUp(int keyCode, KeyEvent event) {  
  30.   ((ThriRend) gl_rend).onKeyUp(keyCode, event);  
  31.   return false;  
  32.  }  
  33.   
  34.  public boolean onTouchEvent(MotionEvent event) {  
  35.   float x = event.getX();  
  36.   float y = event.getY();  
  37.   if (event.getAction() == event.ACTION_MOVE) {  
  38.    ((ThriRend) gl_rend).rato += (x - mPreviousX) * 0.5f;  
  39.   }  
  40.   mPreviousX = x;  
  41.   mPreviousY = y;  
  42.   return super.onTouchEvent(event);  
  43.  }  
  44.   
  45.  protected void onResume() {  
  46.   super.onResume();  
  47.   gl_view.onResume();  
  48.  }  
  49.   
  50.  protected void onPause() {  
  51.   super.onPause();  
  52.   gl_view.onPause();  
  53.  }  
  54. }  
  55.   
  56. import javax.microedition.khronos.egl.EGLConfig;  
  57. import javax.microedition.khronos.opengles.GL10;  
  58.   
  59. import android.opengl.GLSurfaceView.Renderer;  
  60.   
  61. public class BaseRend implements Renderer {  
  62.    
  63.  public float rato = 0.0f;  
  64.   
  65.  public void onDrawFrame(GL10 gl) {  
  66.            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
  67.            gl.glMatrixMode(GL10.GL_MODELVIEW);  
  68.            gl.glLoadIdentity();  
  69.  }  
  70.   
  71.  public void onSurfaceChanged(GL10 gl, int width, int height) {  
  72.            if(height == 0){  
  73.             height = 1;  
  74.            }  
  75.            float ratio = (float)width / (float)height;  
  76.            gl.glViewport(00, width, height);  
  77.            gl.glMatrixMode(GL10.GL_PROJECTION);  
  78.            gl.glLoadIdentity();  
  79.            gl.glFrustumf(-ratio, ratio, -111.0f, 10.0f);  
  80.            gl.glMatrixMode(GL10.GL_MODELVIEW);  
  81.            gl.glLoadIdentity();  
  82.  }  
  83.   
  84.  public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  85.                  gl.glDisable(GL10.GL_DITHER);  
  86. //                 gl.glEnable(GL10.GL_CULL_FACE);  
  87.                  gl.glShadeModel(GL10.GL_SMOOTH);  
  88.                  gl.glClearColor(0000.5f);  
  89.                  gl.glClearDepthf(1.0f);  
  90.                  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  
  91.  }  
  92.   
  93. }  
  94.   
  95. import java.nio.IntBuffer;  
  96.   
  97. import javax.microedition.khronos.egl.EGLConfig;  
  98. import javax.microedition.khronos.opengles.GL10;  
  99.   
  100. import zhou.ne.he.BaseRend;  
  101. import zhou.ne.he.Cube;  
  102. import zhou.ne.he.R;  
  103. import android.content.Context;  
  104. import android.graphics.Bitmap;  
  105. import android.graphics.BitmapFactory;  
  106. import android.opengl.GLUtils;  
  107. import android.view.KeyEvent;  
  108.   
  109. public class ThriRend extends BaseRend {  
  110.   
  111.  public float rato = 0;  
  112.  private int[] texture = null;// 紋理數組  
  113.  private Bitmap[] bit = new Bitmap[6];  
  114.  private boolean key = true;  
  115.   
  116.  public ThriRend(Context context) {  
  117.   bit[0] = BitmapFactory.decodeResource(context.getResources(),  
  118.     R.drawable.icon1);  
  119.   bit[1] = BitmapFactory.decodeResource(context.getResources(),  
  120.     R.drawable.icon2);  
  121.   bit[2] = BitmapFactory.decodeResource(context.getResources(),  
  122.     R.drawable.icon3);  
  123.   bit[3] = BitmapFactory.decodeResource(context.getResources(),  
  124.     R.drawable.icon4);  
  125.   bit[4] = BitmapFactory.decodeResource(context.getResources(),  
  126.     R.drawable.icon5);  
  127.   bit[5] = BitmapFactory.decodeResource(context.getResources(),  
  128.     R.drawable.icon6);  
  129.  }  
  130.   
  131.  public boolean onKeyUp(int keyCode, KeyEvent event) {  
  132.   key = !key;  
  133.   return false;  
  134.  }  
  135.   
  136.  public void onDrawFrame(GL10 gl) {  
  137.   super.onDrawFrame(gl);  
  138.   gl.glTranslatef(0.0f, 0.0f, -5.0f);  
  139.   
  140.   // 設置旋轉  
  141.   // gl.glRotatef(rato, 0.0f, 1.0f, 0.0f);  
  142.   gl.glRotatef(rato, 1.0f, 0.0f, 0.0f);  
  143.   gl.glRotatef(rato, 0.0f, 1.0f, 0.0f);  
  144.   
  145.   gl.glNormalPointer(GL10.GL_FIXED, 0, Cube.normals);  
  146.   gl.glVertexPointer(3, GL10.GL_FIXED, 0, Cube.vertices);  
  147.   gl.glTexCoordPointer(2, GL10.GL_FIXED, 0, Cube.texCoords);  
  148.   
  149.   gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);  
  150.   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  151.   gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
  152.   
  153.   // 繪製四邊形  
  154.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);  
  155.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_BYTE,  
  156.     Cube.indices1);  
  157.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[1]);  
  158.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 8, GL10.GL_UNSIGNED_BYTE,  
  159.     Cube.indices2);  
  160.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[2]);  
  161.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 12, GL10.GL_UNSIGNED_BYTE,  
  162.     Cube.indices3);  
  163.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[3]);  
  164.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 16, GL10.GL_UNSIGNED_BYTE,  
  165.     Cube.indices4);  
  166.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[4]);  
  167.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 20, GL10.GL_UNSIGNED_BYTE,  
  168.     Cube.indices5);  
  169.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[5]);  
  170.   gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 24, GL10.GL_UNSIGNED_BYTE,  
  171.     Cube.indices6);  
  172.   
  173.   gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
  174.   gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  
  175.   gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);  
  176.   // rato += 2.5f;  
  177.   if(key){  
  178.    gl.glEnable(GL10.GL_BLEND); // 打開混合  
  179.    gl.glDisable(GL10.GL_DEPTH_TEST); // 關閉深度測試  
  180.   }else{  
  181.    gl.glDisable(GL10.GL_BLEND); // 打開混合  
  182.    gl.glEnable(GL10.GL_DEPTH_TEST); // 關閉深度測試  
  183.   }  
  184.  }  
  185.   
  186.  public void onSurfaceChanged(GL10 gl, int width, int height) {  
  187.   super.onSurfaceChanged(gl, width, height);  
  188.  }  
  189.   
  190.  public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  191.   super.onSurfaceCreated(gl, config);  
  192.     
  193.    gl.glEnable(GL10.GL_DEPTH_TEST);  
  194.          gl.glDepthFunc(GL10.GL_LEQUAL);  
  195.     
  196.   // 打開紋理  
  197.   gl.glEnable(GL10.GL_TEXTURE_2D);  
  198.   
  199.   // 綁定紋理  
  200.   IntBuffer t_b = IntBuffer.allocate(6);  
  201.   gl.glGenTextures(6, t_b);// 設置紋理的個數  
  202.   texture = t_b.array();  
  203.   
  204.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]);  
  205.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[0], 0);  
  206.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  207.     GL10.GL_NEAREST);  
  208.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  209.     GL10.GL_NEAREST);  
  210.   
  211.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[1]);  
  212.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[1], 0);  
  213.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  214.     GL10.GL_NEAREST);  
  215.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  216.     GL10.GL_NEAREST);  
  217.   
  218.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[2]);  
  219.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[2], 0);  
  220.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  221.     GL10.GL_NEAREST);  
  222.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  223.     GL10.GL_NEAREST);  
  224.   
  225.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[3]);  
  226.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[3], 0);  
  227.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  228.     GL10.GL_NEAREST);  
  229.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  230.     GL10.GL_NEAREST);  
  231.   
  232.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[4]);  
  233.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[4], 0);  
  234.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  235.     GL10.GL_NEAREST);  
  236.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  237.     GL10.GL_NEAREST);  
  238.   
  239.   gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[5]);  
  240.   GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bit[5], 0);  
  241.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,  
  242.     GL10.GL_NEAREST);  
  243.   gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,  
  244.     GL10.GL_NEAREST);  
  245.   
  246.   gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  
  247.   
  248.   gl.glColor4f(1.0f, 1.0f, 1.0f, 0.4f);  
  249.   
  250.   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);  
  251.   
  252.   // 設置環境光  
  253.   gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, Cube.lightAmbient);  
  254.   
  255.   // 設置漫射光  
  256.   gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_DIFFUSE, Cube.lightDiffuse);  
  257.   
  258.   // 設置光源位置  
  259.   gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, Cube.lightPosition);  
  260.   
  261.   // 開啓光源  
  262.   gl.glEnable(GL10.GL_LIGHT1);  
  263.   
  264.   // 開啓混合  
  265.   gl.glEnable(GL10.GL_BLEND);  
  266.  }  
  267.   
  268. }  

轉載自:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-5942.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章