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);
		}
    }
}
原文地址:https://www.cnblogs.com/xiaobo68688/p/2266648.html