Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
// 首先我们看一下用OpenGL绘制一个矩形
#include <GL/glut.h> void display() { // 清除屏幕 glClear(GL_COLOR_BUFFER_BIT); // 指定从glBegin到glEnd描述的基元(primitive),在这里是多边形 glBegin(GL_POLYGON); // 指定多边形的四个顶点 glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5); glVertex2f(0.5, 0.5); glVertex2f(0.5, -0.5); glEnd(); // 强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区中等待其他的OpenGL命令 glFlush(); } void init() { // 设置清除颜色(Clear color)为黑色 glClearColor(0.0, 0.0, 0.0, 0.0); // 设置绘制颜色(Color)为红色 glColor3f(1.0, 0, 0); // 设置当前的操作矩阵为投影矩阵(GL_PROJECTION) glMatrixMode(GL_PROJECTION); // 重置当前矩阵为单位矩阵 glLoadIdentity(); // 设置投影矩阵为整个屏幕 gluOrtho2D(-1.0, 1.0, -1.0, 1.0); } int main(int argc, char *argv[]) { // 初始化glut glutInit(&argc, argv); // 设置显示方式 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置窗口大小为500X500 glutInitWindowSize(500, 500); // 设置窗口出现位置为(0, 0) glutInitWindowPosition(0, 0); // 创建窗口 glutCreateWindow("My Simple"); // 设置显示回调函数(每次需要重绘时都要调用该函数) glutDisplayFunc(display); // 调用自定义的初始化函数 init(); glutMainLoop(); return 0; }
下边是Android上如何绘制一个矩形
// 用Android的OpenGL ES实现了相同的功能 // 代码没有经过优化,为的是容易理解 public class OpenGLTestActivity extends Activity { GLSurfaceView glView; @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); glView.setRenderer(new SimpleRenderer()); setContentView(glView); } class SimpleRenderer implements Renderer { @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT); ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 2 * 4); byteBuffer.order(ByteOrder.nativeOrder()); FloatBuffer vertices = byteBuffer.asFloatBuffer(); // 定义两个三角形的六个顶点 vertices.put(new float[] { 120.0f, 200.0f, 360.0f, 200.0f, 360.0f, 600.0f, 120.0f, 200.0f, 360.0f, 600.0f, 120.0f, 600.0f }); vertices.flip(); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices); gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); gl.glDrawArrays(GL10.GL_TRIANGLES, 3, 3); } @Override public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearColor(0,0,0,1); gl.glColor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glViewport(0, 0, 480, 800); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0, 480, 0, 800, 1, -1); } } }