当前位置:操作系统 > 安卓/Android >>

[Android开发学习09]Android OpenGL ES 基础

 其实,我个人学习Android最主要的目的是学习在此平台下的3D效果的开发。所以,我们开始进入主题吧。

 


OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。

 
在Android中搭建一个3D开发的基本框架:

一、导入opengl es库:


[java]
import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

 


二、加入渲染支持:

在Android中,GLSu易做图ceView包含了一个专门用于渲染3D的接口Renderer,来显示OpenGL视图:

1、导入支持库:


[java]
import android.opengl.GLSu易做图ceView; 
import android.opengl.GLSu易做图ceView.Renderer; 

import android.opengl.GLSu易做图ceView;
import android.opengl.GLSu易做图ceView.Renderer;
2、创建一个GLRender类实现Renderer接口:


[java] view plaincopyprint?public class GLRender implements Renderer 

public class GLRender implements Renderer
{
}
3、实现GLRender类中的3个抽象方法:


[java]
public void onDrawFrame(GL10 gl) 
public void onSu易做图ceChanged(GL10 gl, int width, int height) 
public void onSu易做图ceCreated(GL10 gl, EGLConfig config) 

public void onDrawFrame(GL10 gl)
public void onSu易做图ceChanged(GL10 gl, int width, int height)
public void onSu易做图ceCreated(GL10 gl, EGLConfig config)
① onSu易做图ceCreated 在窗口被创建时被调用,需要做一些必要的初始化工作:
[java] view plaincopyprint?public void onSu易做图ceCreated(GL10 gl, EGLConfig config) 

    // 启用阴影平滑  
    gl.glShadeModel(GL10.GL_SMOOTH); 
 
    // 黑色背景,设置清除屏幕时所用的颜色-->> (R, G, B, A) 取值: 0.0f-1.0f 。  
    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); 
}  

 public void onSu易做图ceCreated(GL10 gl, EGLConfig config)
 {
  // 启用阴影平滑
  gl.glShadeModel(GL10.GL_SMOOTH);
 
  // 黑色背景,设置清除屏幕时所用的颜色-->> (R, G, B, A) 取值: 0.0f-1.0f 。
  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);
 } ②onSu易做图ceChanged 当窗口大小发生改变时被调用,不管窗口的大小是否已经改变,在程序开始时至少运行一次。
   在这个里面,我们要设置OpenGL的场景大小:
[java]
public void onSu易做图ceChanged(GL10 gl, int width, int height) 

    float ratio = (float) width / height; 
    //设置OpenGL场景的大小  
    gl.glViewport(0, 0, width, height); 
    //设置投影矩阵 -->> 增加透视.  
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    //重置投影矩阵 -->> 恢复成原始状态.  
    gl.glLoadIdentity(); 
    // 设置视口的大小 -->> 前4个参数确定窗口的大小,后2个参数分别是在场景中所能绘制深度的起点和终点。  
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); 
    // 选择模型观察矩阵  
    gl.glMatrixMode(GL10.GL_MODELVIEW);  
    // 重置模型观察矩阵  
    gl.glLoadIdentity();                             
 

 public void onSu易做图ceChanged(GL10 gl, int width, int height)
 {
  float ratio = (float) width / height;
  //设置OpenGL场景的大小
  gl.glViewport(0, 0, width, height);
  //设置投影矩阵 -->> 增加透视.
  gl.glMatrixMode(GL10.GL_PROJECTION);
  //重置投影矩阵 -->> 恢复成原始状态.
  gl.glLoadIdentity();
  // 设置视口的大小 -->> 前4个参数确定窗口的大小,后2个参数分别是在场景中所能绘制深度的起点和终点。
  gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
  // 选择模型观察矩阵
  gl.glMatrixMode(GL10.GL_MODELVIEW); 
  // 重置模型观察矩阵
  gl.glLoadIdentity();       

 }③onDrawFrame 在窗口内进行绘图操作。 在绘图之前,需要将屏幕清楚成前面指定的颜色,清楚深度缓存并且重置场景,
   然后就可以绘图了:


[java]
public void onDrawFrame(GL10 gl) 

    // 清除屏幕和深度缓存  
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    // 重置当前的模型观察矩阵  
    gl.glLoadIdentity(); 
 
    // 具体的绘图操作开始 。。。  
 
    } 

 public void onDrawFrame(GL10 gl)
 {
  // 清除屏幕和深度缓存
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  // 重置当前的模型观察矩阵
  gl.glLoadIdentity();

  // 具体的绘图操作开始 。。。

   }

 

 

三、在主程序调用我们写好的接口:
   调用GLSu易做图ceView类的setRenderer方法将我们自己构建的GLRender类设置为默认的Renderer,
   然后,通过setContentView方法使Activity显示一个GLSu易做图ceView即可。


[java]
Renderer render = new GLRender(); 
GLSu易做图ceView glView = new GLSu易做图ceView(this); 
glView.setRenderer(render); 
setContentView(glView); 

Renderer render = new GLRender();
GLSu易做图ceView glView = new GLSu易做图ceView(this);
glView.setRenderer(render);
setConte

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,