本教程及后续教程全部参考或者转载于:OpenGL ES Tutorial for Android
本例相当于openGL的HelloWorld程序。
先贴代码,代码中的注释比较具体了。
主Activity类:
package seven.demo.openglhelloworld; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.Menu; public class OpenGLDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GLSurfaceView view = new GLSurfaceView(this); view.setRenderer(new OpenGLRenderer()); setContentView(view); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_open_gldemo, menu); return true; } }
OpenGLRenderer类,实现Renderer接口:
package seven.demo.openglhelloworld; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLU; /** * 类描述: 功能详细描述: * * @author mengsifan * @date [2012-8-29] */ public class OpenGLRenderer implements Renderer { /** * {@inheritDoc} 在这个方法中主要用来设置一些绘制时不常变化的参数,比如:背景色,是否打开 z-buffer等。 */ @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // 设置背景色 gl.glClearColor(.0f, .0f, .0f, .5f); /* * 设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。 * 采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。 */ gl.glShadeModel(GL10.GL_SMOOTH); // Depth buffer setup. gl.glClearDepthf(1.0f); // Enables depth testing. gl.glEnable(GL10.GL_DEPTH_TEST); // The type of depth testing to do. gl.glDepthFunc(GL10.GL_LEQUAL); // Really nice perspective calculations. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); } /** * {@inheritDoc} 如果设备支持屏幕横向和纵向切换,这个方法将发生在横向<->纵向互换时。此时可以重新设置绘制的纵横比率。 */ @Override public void onSurfaceChanged(GL10 gl, int width, int height) { /* * glViewport(GLint x,GLint y,GLsizei width,GLsizei height)为其函数原型。 * X,Y————以像素为单位,指定了视口的左下角位置。 * width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。 */ gl.glViewport(0, 0, width, height); /* * glMatrixMode设置当前矩阵模式 : * GL_MODELVIEW:对模型视景矩阵堆栈应用随后的矩阵操作。 * GL_PROJECTION:对投影矩阵应用随后的矩阵操作。 * GL_TEXTURE:对纹理矩阵堆栈应用随后的矩阵操作。 * 注意:与glLoadIdentity()一同使用。 */ 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(); } /** * {@inheritDoc} 定义实际的绘图操作。 */ @Override public void onDrawFrame(GL10 gl) { /* * 可以使用 "|"运算符组合不同的缓冲标志位,表明需要清除的缓冲。 例如glClear(GL_COLOR_BUFFER_BIT | * GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲。 */ gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); } }