大龙的博客

常用链接

统计

最新评论

Android OpenGL ES 画正方形

最近玩玩Android的openGL,做了点注释,有用看看,没有了无视

  Java代码

  public class GL1 extends Activity {

  private GLSurfaceView mGLSurfaceView;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  mGLSurfaceView = new GLSurfaceView(this);

  mGLSurfaceView.setRenderer(new One());

  setContentView(mGLSurfaceView);

  }

  @Override

  protected void onResume() {

  super.onResume();

  mGLSurfaceView.onResume();

  }

  @Override

  protected void onPause() {

  super.onPause();

  mGLSurfaceView.onPause();

  }

  }

  /**

  * 渲染器

  *

  * @author yaoyuan

  *

  */

  class One implements Renderer {

  private Square square;

  public One() {

  square = new Square();

  }

  /**

  * 初始化视图

  */

  public void onDrawFrame(GL10 gl) {

  /*

  * 清空缓冲区预设值

  *

  * GL_COLOR_BUFFER_BIT 颜色缓冲区

  *

  * GL_DEPTH_BUFFER_BIT 深度缓冲区

  *

  * GL_STENCIL_BUFFER_BIT 模板缓冲区

  */

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

  gl.glLoadIdentity();

  //乘一个翻译矩阵代替当前的矩阵

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

  //画图形

  square.draw(gl);

  }

  /**

  * 视图改变时调用

  */

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

  if (height == 0) {

  height = 1;

  }

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

  /**

  * 指定当前的矩阵模式

  *

  * GL_MODELVIEW 模型视图 GL_PROJECTION 投影 GL_TEXTURE 纹理

  */

  gl.glMatrixMode(GL10.GL_PROJECTION);

  gl.glLoadIdentity();

  // 设置一个透视投影矩阵

  GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,

  100.0f);

  gl.glMatrixMode(GL10.GL_MODELVIEW);

  gl.glLoadIdentity();

  }

  /**

  * 视图创建时调用

  */

  public void onSurfaceCreated(GL10 gl, EGLConfig config) {

  /*

  * 设置阴影模式 1.GL_FLAT 扁平 2.GL_SMOOTH 平滑

  */

  gl.glShadeModel(GL10.GL_SMOOTH);

  // 指定颜色缓冲区值

  gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

  // 指定深度缓冲区值

  gl.glClearDepthf(1.0f);

  // 可用GL服务端功能

  gl.glEnable(GL10.GL_DEPTH_TEST);

  /*

  * 深度缓存比较

  *

  * GL_NEVER 不通过

  *

  * GL_LESS 如果传入的深度值小于存储深度的值,通过

  *

  * GL_EQUAL 如果传入的传递深度值等于存储的深度值,通过

  *

  * GL_LEQUAL 如果传入的深度值小于或等于存储的深度值,通过

  *

  * GL_GREATER 如果传入的深度值大于存储深度值更大,通过

  *

  * GL_NOTEQUAL 如果传入的深度值不等于存储深度值,通过

  *

  * GL_GEQUAL 如果传入的深度值大于或等于存储深度值,通过

  *

  * GL_ALWAYS 始终通过

  */

  gl.glDepthFunc(GL10.GL_LEQUAL);

  // 指定特定于实现的提示

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

  }

  }

  /**

  * 图形

  *

  * @author yaoyuan

  *

  */

  class Square {

  private FloatBuffer vertexBuffer;

  private float vertices[] = {

  -1.0f, 1.0f, 0.0f,

  1.0f, 1.0f, 0.0f,

  -1.0f, -1.0f, 0.0f,

  1.0f, -1.0f, 0.0f

  };

  public Square() {

  ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);

  byteBuf.order(ByteOrder.nativeOrder());

  vertexBuffer = byteBuf.asFloatBuffer();

  vertexBuffer.put(vertices);

  vertexBuffer.position(0);

  }

  public void draw(GL10 gl) {

  // 定义前、后面对(GL_CW顺时针、GL_CCW逆时针)

  gl.glFrontFace(GL10.GL_CW);

  // 定义一个定点坐标数组

  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

  /*

  * 启用客户端功能

  *

  * GL_COLOR_ARRAY 当glDrawArrays、glDrawElements被调用时,颜色数组可以被读写

  *

  * GL_NORMAL_ARRAY 当glDrawArrays、glDrawElements被调用时,普通数组可以被读写

  *

  * GL_TEXTURE_COORD_ARRAY 当glDrawArrays、glDrawElements被调用时,践理?酵可以被读写

  *

  * GL_VERTEX_ARRAY 当glDrawArrays、glDrawElements被调用时,矩阵数组可以被读写

  */

  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

  // 从数组数据中渲染图元

  gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

  // 禁用客户端功能

  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

  }

  }

posted on 2011-01-10 16:02 大龙 阅读(1487) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理