Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38574
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-28 17:38
文章分类
文章存档

2013年(25)

我的朋友

分类: Android平台

2013-04-07 15:34:53

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中,GLSurfaceView包含了一个专门用于渲染3D的接口Renderer,来显示OpenGL视图:


1、导入支持库:




[java]
import android.opengl.GLSurfaceView; 
import android.opengl.GLSurfaceView.Renderer; 


import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.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 onSurfaceChanged(GL10 gl, int width, int height) 
public void onSurfaceCreated(GL10 gl, EGLConfig config) 


public void onDrawFrame(GL10 gl)
public void onSurfaceChanged(GL10 gl, int width, int height)
public void onSurfaceCreated(GL10 gl, EGLConfig config)
① onSurfaceCreated 在窗口被创建时被调用,需要做一些必要的初始化工作:
[java] view plaincopyprint?public void onSurfaceCreated(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 onSurfaceCreated(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);
 } ②onSurfaceChanged 当窗口大小发生改变时被调用,不管窗口的大小是否已经改变,在程序开始时至少运行一次。
   在这个里面,我们要设置OpenGL的场景大小:
[java]
public void onSurfaceChanged(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 onSurfaceChanged(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();


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


   }


 


 


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




[java]
Renderer render = new GLRender(); 
GLSurfaceView glView = new GLSurfaceView(this); 
glView.setRenderer(render); 
setContentView(glView); 


Renderer render = new GLRender();
GLSurfaceView glView = new GLSurfaceView(this);
glView.setRenderer(render);
setContentView(glView);


 


 


到这里,我们的基本框架就搭建好了。
阅读(605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~