绘制简单的图形.

OpenGL基础:

安装插件: 新建C++控制台项目->空项目->项目->管理NuGet程序包->浏览->搜索NupenGL->安装搜索到的两个插件即可

必须引入头文件:

#include<GL/glut.h>

初始化函数:

 void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}

绘图函数:

void mySegment(void) {
	glClear(GL_COLOR_BUFFER_BIT);
…//绘制代码
	glFlush();
}

主函数一般格式:

void main(int argc,char** argv) {
	//初始化
	glutInit(&argc, argv);
	//创建窗口显示模式
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	//设置初始窗口位置
	glutInitWindowPosition(50, 100);
	//初始化窗口大小
	glutInitWindowSize(400, 300);
	//创建顶层窗口,窗口名
	glutCreateWindow("An Example OpenGL Program");
	
	init();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//注册当前窗口的回调函数--显示函数
	glutDisplayFunc(mySegment);//仅可使用一次函数
	//设置窗口背景色
	glClearColor(1.0f, 1.0f, 0.0f, 0.5f);
	//事件处理循环
	glutMainLoop();

}

现在可以在绘图函数mySegment中添加绘制代码了:

画点:

int point1[] = { 20,120};
	int point2[] = { 45,120 };
	int point3[] = { 55,140 };
	glPointSize(3);
	glColor3f(0.0, 0.4, 0.2);
	glBegin(GL_POINTS);
		glVertex2iv(point1);
		glVertex2iv(point2);
		glVertex2iv(point3);
	glEnd();

画线:

	glColor3f(0.0, 0.4, 0.2);
		glBegin(GL_LINES);
		glVertex2i(28, 125);  //第一个值:  从左往右增大
		glVertex2i(10, 145);  //第二个值:  从下往上增大   这个点是上面的
	glEnd();

画三角形:

	glColor3f(0.0, 0.4, 0.2);
	glBegin(GL_LINE_LOOP);
		glVertex2i(40, 130);
		glVertex2i(60, 130);
		glVertex2i(50, 145);
	glEnd();

画六边形的第一种方式(条带法):

	int p1[] = { 50,100 };
	int p2[] = { 70, 80 };
	int p3[] = { 90, 80 };
	int p4[] = { 110, 100 };
	int p5[] = { 90, 120 };
	int p6[] = { 70, 120 };

	glColor3f(0.0, 0.4, 0.2);
	glBegin(GL_TRIANGLE_STRIP);
		glVertex2iv(p1);
		glVertex2iv(p2);
		glVertex2iv(p6);
		glVertex2iv(p3);
		glVertex2iv(p5);
		glVertex2iv(p4);
	glEnd();

画六边形的第二种方式(扇形法):

	int p7[] = { 120,100 };
	int p8[] = { 140, 80 };
	int p9[] = { 160, 80 };
	int p10[] = { 180, 100 };
	int p11[] = { 160, 120 };
	int p12[] = { 140, 120 };
	glColor3f(0.0, 0.4, 0.2);
	glBegin(GL_TRIANGLE_FAN);
		glVertex2iv(p7);
		glVertex2iv(p8);
		glVertex2iv(p9);
		glVertex2iv(p10);
		glVertex2iv(p11);
		glVertex2iv(p12);
	glEnd();

参考:

画五个小到大而且不同颜色的点:

	for (int i = 1; i <= 5; i++) {
		glColor3f(0.3*i, 0.2*i, 0.1*i);
		glPointSize(i);
		glBegin(GL_POINTS);
		GLfloat x = 120+5*i;
		GLfloat y = 120+5*i;
		glVertex2f(x, y);
		glEnd();
	}

画宽度分别为1 3 5 而且不同类型的直线:

	for (int i = 1; i <= 5; i++,i++) {
		glEnable(GL_LINE_STIPPLE);//启用线型更改
		glColor3f(0.3*i, 0.2*i, 0.1*i);
		glLineWidth(i);//线宽
		switch (i)
		{
		case 1: glLineStipple(1, 0x1C47); break;
		case 3: glDisable(GL_LINE_STIPPLE); break;
		case 5: glLineStipple(1, 0x0101); break;
		}
		glBegin(GL_LINES);
		GLfloat x = 80 + 5 * i;
		GLfloat y = 80 + 5 * i;
		glVertex2f(x, y);
		glVertex2f(2*x, y);
		glEnd();
	}

	glDisable(GL_LINE_STIPPLE);//结束线型

利用SMOOTH填充方式画一个彩色渐变的三角形(注释掉的代码涉及正反面和绘制方式, 你可自行取消注释运行看看):

//SMOOTH填充
	glShadeModel(GL_SMOOTH);

	// 设置正面为填充模式
	//glPolygonMode(GL_FRONT, GL_FILL);
	// 设置反面为线形模式
	//glPolygonMode(GL_BACK, GL_LINE);

	//glFrontFace(GL_CW);  //切换为反面
	glBegin(GL_TRIANGLES);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(60, 90);
	glColor3f(1.0, 0.0, 0.0);
	glVertex2i(90, 120);
	glColor3f(0.0, 1.0, 0.0);
	glVertex2i(75, 130);
	glEnd();

另一种绘制方式FLAT:

	glShadeModel(GL_FLAT);
	glBegin(GL_TRIANGLES);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(20, 90);
	glColor3f(1.0, 0.0, 0.0);
	glVertex2i(40, 120);
	glColor3f(0.0, 1.0, 0.0);
	glVertex2i(35, 130);
	glEnd();

当两个图形有相交部分可能要用到颜色调和(以蓝色和绿色正方形为例):

//启动调和
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

	//蓝色正方形
	glShadeModel(GL_FLAT);
	glColor4f(0.0, 0.0, 1.0,1.0);
	glBegin(GL_TRIANGLE_STRIP);
	glVertex2i(20, 20);
	glVertex2i(20, 40);
	glVertex2i(40, 20);
	glVertex2i(40, 40);
	glEnd();

	//绿色正方形
	glShadeModel(GL_FLAT);
	glColor4f(0.0, 1.0, 0.0,0.2);
	glBegin(GL_TRIANGLE_STRIP);
	glVertex2i(30, 20);
	glVertex2i(30, 40);
	glVertex2i(50, 20);
	glVertex2i(50, 40);
	glEnd();
	//关闭调和
	glDisable(GL_BLEND);

参考:

最后, 展示一个完整代码: (利用绘制图形和上色来制作一幅有意义的图)


#include<GL/glut.h>
#include <cstdlib>
#include <ctime>
#include <math.h>

const int n = 100;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;
void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}


void mySegment(void) {
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

	//圆
	glColor3f(0.0, 1.0, 1.0);
	glBegin(GL_POLYGON);//OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,
					   //glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点
					   //GL_POLYGON表示画多边形(由点连接成多边形)
	
	for (int i = 0; i<n; ++i)
		glVertex2f(0.3*R*cos(2 * Pi / n*i)+0.7, 0.3*R*sin(2 * Pi / n*i)+0.7);

	glEnd();

	//随机白点
	glColor3f(1.0, 1.0, 1.0);
	//glPointSize(3);
	srand(time(NULL));
	for (int i = 0; i < 50; i++) {
		glColor3f(1/ (float)(i)+0.3,1/(float)(i)+0.1,1/ (float)(i)+0.5);
		glPointSize(rand() % (18 + 1) / (float)(5) - 1);
		glBegin(GL_POINTS);
		GLfloat x = rand() % (100 + 1) / (float)(50) - 1;
		GLfloat y = rand() % (100 + 1) / (float)(50) - 1;
		glVertex2f(x, y);
		glEnd();
	}


	//底部折线
	glColor3f(1.0, 0.4, 1.0);
	glBegin(GL_LINE_STRIP);
	glVertex2f(-1.0, -0.6);
	glVertex2f(-0.7, -1.0);
	glVertex2f(-0.5, -0.7);
	glVertex2f(-0.2, -1.0);
	glVertex2f(0.0, -0.8);
	glVertex2f(0.3, -1.0);
	glVertex2f(0.5, -0.7);
	glVertex2f(0.7, -0.9);
	glVertex2f(0.9, -0.6);
	glVertex2f(1.0, -1.0);
	glEnd();



	glutSwapBuffers();
	//glFlush();
}


void main(int argc, char** argv) {
	//初始化
	glutInit(&argc, argv);
	//创建窗口显示模式
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	//设置初始窗口位置
	glutInitWindowPosition(50, 100);
	//初始化窗口大小
	glutInitWindowSize(400, 300);
	//创建顶层窗口,窗口名
	glutCreateWindow("An Example OpenGL Program");

	init();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//注册当前窗口的回调函数--显示函数
	glutDisplayFunc(mySegment);//仅可使用一次函数
	//设置窗口背景色
	glClearColor(0.0, 0.0 ,0.0, 0.0);
	//事件处理循环
	glutMainLoop();

}

大致是这样: