萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> Android開發之OpenGL ES 顏色

Android開發之OpenGL ES 顏色

  一、基礎知識:

  1.平滑著色(Smooth coloring):

  將多個頂點的不同顏色混合在一起,創建出漂亮的色彩混合。

  2.單調著色:

  給圖形塗上一種固定單一的顏色。

  3.三角形定義的顏色數組(平滑著色):

  [java]

  int one = 0x10000;

  //三角形的頂點顏色值(r,g,b,a)

  private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{

  one,0,0,one,

  0,one,0,one,

  0,0,one,one,

  });

  int one = 0x10000;

  //三角形的頂點顏色值(r,g,b,a)

  private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{

  one,0,0,one,

  0,one,0,one,

  0,0,one,one,

  });

  [java]

  // 開啟顏色渲染功能.

  gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

  // 設置三角形頂點的顏色

  gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);

  //關閉顏色渲染功能.

  gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

  // 開啟顏色渲染功能.

  gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

  // 設置三角形頂點的顏色

  gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);

  //關閉顏色渲染功能.

  gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

  4.正方形定義的顏色數組(單調著色):

  [java]

  /* 渲染正方形 */

  // 設置當前色為藍色

  gl.glColor4f(1.0f, 0.5f, 1.0f, 1.0f);

  /* 渲染正方形 */

  // 設置當前色為藍色

  gl.glColor4f(1.0f, 0.5f, 1.0f, 1.0f);

  二、代碼編輯:

  【Activity01.java】

  [java]

  package com.yarin.android.Examples_12_02;

  import android.app.Activity;

  import android.opengl.GLSurfaceView;

  import android.opengl.GLSurfaceView.Renderer;

  import android.os.Bundle;

  public class Activity01 extends Activity

  {

  Renderer render = new GLRender();

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

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

  super.onCreate(savedInstanceState);

  GLSurfaceView glView = new GLSurfaceView(this);

  glView.setRenderer(render);

  setContentView(glView);

  }

  }

  package com.yarin.android.Examples_12_02;

  import android.app.Activity;

  import android.opengl.GLSurfaceView;

  import android.opengl.GLSurfaceView.Renderer;

  import android.os.Bundle;

  public class Activity01 extends Activity

  {

  Renderer render = new GLRender();

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

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

  super.onCreate(savedInstanceState);

  GLSurfaceView glView = new GLSurfaceView(this);

  glView.setRenderer(render);

  setContentView(glView);

  }

  }

  【GLRender.java】

  [java]

  package com.yarin.android.Examples_12_02;

  import java.nio.IntBuffer;

  import javax.microedition.khronos.egl.EGLConfig;

  import javax.microedition.khronos.opengles.GL10;

  import android.opengl.GLSurfaceView.Renderer;

  public class GLRender implements Renderer

  {

  int one = 0x10000;

  //三角形三個頂點

  private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{

  0,one,0, //上頂點

  -one,-one,0, //坐下點

  one,-one,0,}); //右下點

  //正方形的4個頂點

  private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{

  one,one,0,

  -one,one,0,

  one,-one,0,

  -one,-one,0});

  //三角形的頂點顏色值(r,g,b,a)

  private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{

  one,0,0,one,

  0,one,0,one,

  0,0,one,one,

  });

  @Override

  public void onDrawFrame(GL10 gl)

  {

  // 清除屏幕和深度緩存

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

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

  gl.glLoadIdentity();

  // 左移 1.5 單位,並移入屏幕 6.0

  gl.glTranslatef(-1.5f, 0.0f, -6.0f);

  //設置定點數組

  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

  //設置顏色數組 -- 開啟顏色渲染功能.

  gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

  // 設置三角形頂點的顏色

  gl.glColorPointer(4, GL10.GL_FIXED, 0, colorBuffer);

  // 設置三角形頂點

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

  //繪制三角形

  gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

  //關閉顏色數組 -- 關閉顏色渲染功能.

  gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

  /* 渲染正方形 */

  // 設置當前色為藍色

  gl.glColor4f(1.0f, 0.5f, 1.0f, 1.0f);

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

  gl.glLoadIdentity();

  // 左移 1.5 單位,並移入屏幕 6.0

  gl.glTranslatef(1.5f, 0.0f, -6.0f);

  //設置和繪制正方形

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

  gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

  //取消頂點數組

  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

  }

  @Override

  public void onSurfaceChanged(GL10 gl, int width, int height)

  {

  // TODO Auto-generated method stub

  float ratio = (float) width / height;

  //設置OpenGL場景的大小

  gl.glViewport(0, 0, width, height);

  //設置投影矩陣

  gl.glMatrixMode(GL10.GL_PROJECTION);

  //重置投影矩陣

  gl.glLoadIdentity();

  // 設置視口的大小

  gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);

  // 選擇模型觀察矩陣

  gl.glMatrixMode(GL10.GL_MODELVIEW);

  // 重置模型觀察矩陣

  gl.glLoadIdentity();

  }

  @Override

  public void onSurfaceCreated(GL10 gl, EGLConfig config)

  {

  // 啟用陰影平滑

  gl.glShadeModel(GL10.GL_SMOOTH);

  // 黑色背景

  gl.glClearColor(0, 0, 0, 0);

  // 設置深度緩存

  gl.glClearDepthf(1.0f);

  // 啟用深度測試

  gl.glEnable(GL10.GL_DEPTH_TEST);

  // 所作深度測試的類型

  gl.glDepthFunc(GL10.GL_LEQUAL);

  // 告訴系統對透視進行修正

  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

  }

  }

  package com.yarin.android.Examples_12_02;

  import java.nio.IntBuffer;

  import javax.microedition.khronos.egl.EGLConfig;

  import javax.microedition.khronos.opengles.GL10;

  import android.opengl.GLSurfaceView.Renderer;

  public class GLRender implements Renderer

  {

  int one = 0x10000;

  //三角形三個頂點

  private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{

  0,one,0, //上頂點

  -one,-one,0, //坐下點

  one,-one,0,}); //右下點

  //正方形的4個頂點

  private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{

  one,one,0,

  -one,one,0,

  one,-one,0,

  -one,-one,0});

  //三角形的頂點顏色值(r,g,b,a)

  private IntBuffer colorBuffer = IntBuffer.wrap(new int[]{

  one,0,0,one,

  0,one,0,one,

  0,0,one,one,

  });

  @Override

  public void onDrawFrame(GL10 gl)

  {

  // 清除屏幕和深度緩存

  gl.glClear(GL10.GL_CO

copyright © 萬盛學電腦網 all rights reserved