翻译:OpenGL ES Tutorial for Android – Part I – Setting up the view
原文地址:点击这里
第一次翻译,部分参考网络。对英文欠佳的同学提供一点点方便。废话不多,分割线后皆为译文。
========================================================================
我将要写一些在 Android 手机上使用 OpenGL ES 的教程。在不同设备上 OpenGL 的理论是一样的,所以,当要跨平台移植的时候应该会很容易。
文中一些详细资料我并不一定能够记得到底是在那里找到的,所以原文的引用说明不一定正确。如果你觉得文中一些内容是引用是出自你手,而我又忘了说明,请你E-mail我。
在代码例子中,有两种不同的连接。具体的函数会链接至 Android 官方文档,之后的会链接至 OpenGL 文档。比如:
gl.glClearColor(0.0f,0.0f,0.0f,0.5f); //OpenGl docs.
那么,开始吧。
在这个教程中我会教你如何设置你的OpenGL ES View---这总是一个比较好开始的地方。
设置一个OpenGL ES View
设置一个 OpenGL view 总是很容易的,在Android上也一样。我们就从下面这2个东西开始。
GLSurfaceView
GLSurfaceView 在 Android 1.5中是一个API类,用于帮助你写 OpenGL ES 应用程序。作用如下:
提供了连接 OpenGL ES 和 View 系统的粘合代码。
提供了OpenGL ES 和 Activity 生命周期协调工作的粘合代码。
更容易选择合适的缓冲帧像素格式。
创建并管理一个单独的渲染线程实现平滑动画。
提供简单易容的调试工具来追踪 OpenGL ES API 调用以及检查错误。
如果你想快速的开始你的 OpenGL ES 应用,从这里开始看比较好。
你唯一需要调用的函数是:
public void setRenderer(GLSurfaceView.Render renderer)
了解更多关于: GLSurfaceView
GLSurfaceView.Renderer
GLSurfaceView.Renderer 是一个通用的渲染接口。你需要实现所有的方法来渲染帧。
有下面3个方法需要实现:
//当surface被创建或重新创建的时候调用
public void onSurfaceCreated(GL10 gl, EGLConfig config)
//画当前帧时调用
public void onDrawFrame(GL10 gl)
//当surface改变大小时调用
public void onSurfaceChanged(GL10 gl, int width, int height)
onSurfaceCreated
这里合适写一些在渲染周期中不会经常改变的代码。比如初始屏幕颜色、打开Z轴缓冲等。
onDrawFrame
这里执行绘图。
onSurfaceChanged
如果你的设备支持横竖屏切换,当切换时会调用这个方法。你需要做的是重新设定比例。
组合起来
首先我们创建一个 Activity, 简单干净就好。
package se.jayway.opengl.tutorial;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class TutorialPartI extends Activity {
/** Activity 第一次建立时调用 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new OpenGLRenderer());
setContentView(view);
}
}
我们的渲染器需要多一些的设置,看看代码一会我就解释他们。
package se.jayway.opengl.tutorial;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
public class OpenGLRenderer implements Renderer {
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax.
* microedition.khronos.opengles.GL10, javax.microedition.khronos.
* egl.EGLConfig)
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 设置背景颜色 ( rgba ).
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // OpenGL docs.
// 开启平滑阴影,默认的就是。
gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs.
// 设置深度缓冲。
gl.glClearDepthf(1.0f);// OpenGL docs.
// 设置深度缓冲测试。
gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs.
// 设置深度缓冲测试类型。
gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs.
// 真实透视计算。
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs.
GL10.GL_NICEST);
}
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax.
* microedition.khronos.opengles.GL10)
*/
public void onDrawFrame(GL10 gl) {
// 清除屏幕和深度缓冲。
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs.
GL10.GL_DEPTH_BUFFER_BIT);
}
/*
* (non-Javadoc)
*
* @see
* android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax.
* microedition.khronos.opengles.GL10, int, int)
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
// 设置当前视图大小。
gl.glViewport(0, 0, width, height);// OpenGL docs.
// 选择投影模型。
gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs.
// 重置投影模型。
gl.glLoadIdentity();// OpenGL docs.
// 计算窗口纵横比。
GLU.gluPerspective(gl, 45.0f,
(float) width / (float) height,
0.1f, 100.0f);
// 选择modelview模型(Select the modelview matrix)。
gl.glMatrixMode(GL10.GL_MODELVIEW);// OpenGL docs.
// 重置modelview模型。
gl.glLoadIdentity();// OpenGL docs.
}
}
Fullscreen
在 OpenGLDemo 类中增加下面内容,设置为全屏显示。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // (新增)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN); // (新增)
... // 以前的代码.
}
这些已经足够让你的 OpenGL ES view 运行起来了。如果你编译并运行它,你会看见一个不错的黑屏。