#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;
}