绘制简单的图形.
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();
}
大致是这样:
