// 首先我们看一下用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);
}
}
}