OpenGL代码学习(3)
#include <iostream> #include <GLUT/GLUT.h> #include "math3d.h" // 绘制五角星 void draw4() { const GLfloat Pi = 3.1415926536f; GLfloat a = 1 / (2-2*cos(72*Pi/180)); GLfloat bx = a * cos(18 * Pi/180); GLfloat by = a * sin(18 * Pi/180); GLfloat cy = -a * cos(18 * Pi/180); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); // 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出 glBegin(GL_LINE_LOOP); glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush(); } // 绘制圆 (这样画出来的竟然是个椭圆) void draw3() { glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.f, 0.f, 0.f); glBegin(GL_POLYGON); const int n = 10; const GLfloat R = 0.5f; const GLfloat pi = 3.1415926f; for (int i = 0; i < n; i++) { glVertex2f(R*cos(2 * pi / n * i), R * sin(2 * pi / n * i)); } glEnd();//结束渲染 glFlush();//强制刷新缓存区,保证绘制命令得以执行 } // 绘制正方形 void draw2() { // 设置清屏颜色 红、绿、蓝、透明度 /* 在Windows中 颜色成分取值范围 0~255之间 在iOS、OS c颜色成分取值范围 0~1之间浮点数 */ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); /* 清除缓存区对数值进行预置 参数:指定将要清楚的缓存区的遮罩的按位或运算。 GL_COLOR_BUFFER_BIT: 指示当前激活的用来进行颜色写入缓存区 GL_DEPTH_BUFFER_BIT:指示深度缓存区 GL_STENCIL_BUFFER_BIT:指示模板缓存区 每个缓存区的清楚值根据这个缓存区的清楚值设置不同。 错误: 如果设定不是以上三个参考值,返回GL_INVALID_VALUE */ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); /* 设置颜色 */ glColor3f(1.0f, 0.0f, 0.0f); /* 设置绘图时的坐标系统 左、右、上、下、近、远 */ glOrtho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); /* 开始渲染 */ glBegin(GL_POLYGON); /* 设置多边形的4个顶点 */ glVertex3f(0.25f, 0.25f, 0.0f); glVertex3f(0.75f, 0.25f, 0.0f); glVertex3f(0.75f, 0.75f, 0.0f); glVertex3f(0.25f, 0.75f, 0.0f); /* 效果一样 glVertex2f(0.25f, 0.25f); glVertex2f(0.75f, 0.25f); glVertex2f(0.75f, 0.75f); glVertex2f(0.25f, 0.75f); */ /* 结束渲染 */ glEnd(); /* 强制刷新缓存区,保证绘制命令得以执行 */ glFlush(); } // 绘制正弦函数 void draw1() { const GLfloat factor = 0.1f; GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glVertex2f(-1.f, 0.f); glVertex2f(1.f, 0.f); glVertex2f(0.f, -1.f); glVertex2f(0.f, 1.f); glEnd(); glBegin(GL_LINE_STRIP); for (x = -1.f/factor; x < 1.f/factor; x += 0.01f) { glVertex2f(x * factor, sin(x) * factor); } glEnd(); glFlush(); } int main(int argc, const char *argv[]) { // 1 初始化一个GLUT库 glutInit(&argc, (char **)argv); // 2 创建一个窗口并制定窗口名 glutInitWindowSize(717, 717); glutCreateWindow("OpenGLTest003"); // 3 注册一个绘图函数,操作系统在必要时刻就会对窗体进行重绘制操作 // 它设置了一个显示回调(diplay callback),即GLUT在每次更新窗口内容的时候会自动调用该例程 glutDisplayFunc(draw4); // 这是一个无限执行的循环,它会负责一直处理窗口和操作系统的用户输入等操作。(注意:不会执行在glutMainLoop()之后的所有命令) glutMainLoop(); return 0; }