Andriod OpenGL 教程 01 - 创建一个OpenGL 窗口
来源:互联网 发布:软件监控系统 编辑:程序博客网 时间:2024/04/28 01:53
关键字: android OpenGL 移动开发 教程
最近学习Android系统中3D编程,发现网络上资料虽多,但是都比较散,不成体系。网上有一些移植著名的OpenGL学习教程NeHe的资料,但是都不完整。因此趁此学习的机会, NeHe教程尽量完整移植,在移植过程中尽量利用了网络上已有的资源,整理成一个系统的学习材料, 也许对学习在Android上做3D开发的朋友有一些帮助。
Android中的OpenGL图形系统分为java框架和本地代码两部分。本地代码主要实现的 OpenGL接口的库,在 Java框架层,javax.microedition.khronos.opengles是 java标准的 OpenGL包,android.opengl包提供了 OpenGL系统和 Android GUI系统之间的联系。
这一课,演示如何在Android中创建一个OpenGL窗口,它是我们以后应用程序的框架。
在Andriod系统中, 使用GLSurfaceView来显示OpenGL视图,该类位于android.opengl里,GLSurfaceView的典型用法如下:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建一个GLSurfaceView GLSurfaceView glView = new GLSurfaceView(this); glView.setRenderer(new MyGLRenderer(this));// 使用定制的渲染器 setContentView(glView);}
GLSurfaceView提供了一个专门用于渲染的接口Renderer。因此需要实现一个类这里是MyGLRenderer来实现Renderer接口。并且必须重写以下三个方法:
public void onSurfaceCreate(GL10 gl, EGLConfig config)
public void onSurfaceChanged(GL10 gl, int width, int height)
public void onDrawFrame(GL10 gl)
当OpenGL视图窗口被创建时,调用onSurfaceCreate,因此我们可以再这里对OpenGL做一些初始化工作,如在MyGLRender中onSurfaceCreate的实现代码为:
public void onSurfaceCreated(GL10 gl, EGLConfig config){// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 设置背景颜色gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f);// 设置深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所作深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);}
当渲染窗口发生变化时,系统将调用onSurfaceChange方法,因此在该方法中,我们可以设置OpenGL视图窗口的大小,代码如下:
public void onSurfaceChanged(GL10 gl, int width, int height){if(height == 0)// 防止被零除{height = 1;}// 重置当前的视图区域gl.glViewport(0, 0, width, height);// 选择投影矩阵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();}
实际画场景在方法onDrawFrame里实现,在这一课,我们只是绘制一个OpenGL窗口,因为里面只有清除屏幕和深度缓存和重置当前的模型观察矩阵,并没有回实际的图形。
onDrawFrame代码如下:
public void onDrawFrame(GL10 gl){// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 重置当前的模型观察矩阵gl.glLoadIdentity();}
源代码文件:
GLLesson01Activity.java
package wintop.gllesson01;import android.app.Activity;import android.os.Bundle;import android.opengl.GLSurfaceView;//导入OpenGL渲染面//import android.view.Window;//import android.view.WindowManager;public class GLLesson01Activity extends Activity {private GLSurfaceView glView;// 使用GLSurfaceView /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 全屏设置 //requestWindowFeature(Window.FEATURE_NO_TITLE); //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); glView = new GLSurfaceView(this);// 创建一个GLSurfaceView glView.setRenderer(new MyGLRenderer(this));// 使用定制的渲染器 setContentView(glView); } // 当应用进入到后台方式时调用 @Override protected void onPause(){ super.onPause(); glView.onPause(); } // onPause之后调用 @Override protected void onResume() { super.onResume(); glView.onResume(); }}
MyGLRenderer.java
package wintop.gllesson01;import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;import android.content.Context;import android.opengl.GLSurfaceView;import android.opengl.GLU;public class MyGLRenderer implements GLSurfaceView.Renderer {Context context;// 应用的上下文句柄// Constructor with global application contextpublic MyGLRenderer(Context context) {this.context = context;}// Call back when the surface is first created or re-created@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config){// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 设置背景颜色gl.glClearColor(0.2f, 0.4f, 0.52f, 1.0f);// 设置深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所作深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);}// Call back after onSurfaceCreated() or whenever the window's size changes@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height){if(height == 0)// 防止被零除{height = 1;}// 重置当前的视图区域gl.glViewport(0, 0, width, height);// 选择投影矩阵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();}// Call back to draw the current frame.@Overridepublic void onDrawFrame(GL10 gl){// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 重置当前的模型观察矩阵gl.glLoadIdentity();}}
最终的运行结果下图所示:
源代码下载地址:http://download.csdn.net/detail/seniorwizard/4460814
- Andriod OpenGL 教程 01 - 创建一个OpenGL 窗口
- 【Qt OpenGL教程】01:创建一个OpenGL窗口
- Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)
- [OpenGL]创建一个窗口
- opengl 教程(1) 创建窗口
- OpenGL 创建一个CEGUI窗口
- OpenGL中创建一个窗口
- NeHe OpenGL教程第一课 创建一个OpenGL窗口(Wiin32)
- Qt OpenGL----创建openGL窗口
- Andriod OpenGL 教程 04 - 旋转
- Andriod OpenGL 教程 08 - 混合
- xlib创建一个openGL简单窗口
- Opengl备忘--创建一个简单GLFW窗口
- OpenGL入门(一):创建一个窗口
- Qt 创建OpenGL窗口
- 创建OpenGL窗口
- 【Modern OpenGL】创建窗口
- OpenGL 窗口创建
- 中国社会体制的划分
- 在JBPM的Handle类中调用Spring管理的类
- 常用,易用,好看的第三方控件(.NET)
- bin和sbin的区别
- Boosting, Online Boosting,adaboost
- Andriod OpenGL 教程 01 - 创建一个OpenGL 窗口
- getCurrentSession与OpenSessiond的区别
- xilinx_camera 2012_7_28
- 二维数组的动态定义
- 51单片机(AT89C52)一键多功能(短按、长按)
- JavaScript语法入门系列(七) 类和对象(前言)
- 【Android】开启关闭GPRS
- DotNet平台主要开发技术总结与经验 .
- Qt Windows消息处理-热键注册