安装nupengl程序包
在上一节中,已经说明白怎么安装nupengl程序包了,不会的可以去翻一下。
后面每次我们新建项目的话都需要重新安装程序包,程序包是跟着项目走的。
首先,引入头文件:
#include <GL/glut.h>
创建主函数:
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(300, 100);
glutInitWindowSize(600, 500);
glutCreateWindow("Lines | Triangle");
init();
//glutDisplayFunc(lines); //传递需要勾画的函数
glutMainLoop();
return 0;
}
创建init()-窗口初始化函数:
void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-10, 20, -10, 20); //可视的范围,类似鼠标滚轮的远近
}
Ctrl+F5运行,会生成窗体如下:
接下来要在这个空的窗体上画我们的线段。
首先,将main函数中的//glutDisplayFunc(lines); //传递需要勾画的函数
取消注释,这是调用线段的操作;
然后,创建lines-线段函数:
void lines()
{
int p1[] = { 0,4 };
int p2[] = { 6,4 };
int p3[] = { 1,0 };
int p4[] = { 3,7 };
int p5[] = { 5,0 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.3, 0.1, 0.8);
glPointSize(3);
//glBegin(GL_POINTS); //画点
//glBegin(GL_LINES); //画线段
//glBegin(GL_LINE_STRIP); //画连续线段
glBegin(GL_LINE_LOOP); //画封闭线段,你的第一个五角星
glVertex2iv(p1); //glVertex2i后加v可直接调用向量,向量可提前写到前面
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
glFlush();
}
画点还是画线段由glBegin
后面的参数决定,上面我试了几种。
线段的渲染效果如下:
上面我们已经用线段勾勒出一个五角星了,不过还都是点和线的操作,这部分我们来绘制一个多边形(包括三角形、四边形)。
首先将main函数glutDisplayFunc()
中的参数改为polgonTriangle
,表示我们现在要画多边形了;
然后创建polgonTriangle
函数:
void polgonTriangle()
{
int p1[] = { 1,3 };
int p2[] = { 3,0 };
int p3[] = { 6,0 };
int p4[] = { 7,3 };
int p5[] = { 6,6 };
int p6[] = { 3,6 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.6,0.5,0.2);
glPointSize(3);
//glBegin(GL_POINTS);
//glBegin(GL_POLYGON); //画多边形
glBegin(GL_TRIANGLES); //画三角形(3个顶点)
//glBegin(GL_QUADS); //画四边形
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glVertex2iv(p6);
glEnd();
glFlush();
}
因为我这个函数中创建了6个顶点,所以会创建2个三角形,绘制效果如下:
main.cpp
/*
** 绘制线段、多边形和三角形(理解点、线、面,会绘制各种图元)
*/
#include <GL/glut.h>
void lines()
{
int p1[] = { 0,4 };
int p2[] = { 6,4 };
int p3[] = { 1,0 };
int p4[] = { 3,7 };
int p5[] = { 5,0 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.3, 0.1, 0.8);
glPointSize(3);
//glBegin(GL_POINTS); //画点
//glBegin(GL_LINES); //画线段
//glBegin(GL_LINE_STRIP); //画连续线段
glBegin(GL_LINE_LOOP); //画封闭线段,你的第一个五角星
glVertex2iv(p1); //glVertex2i后加v可直接调用向量,向量可提前写到前面
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
glFlush();
}
void polgonTriangle()
{
int p1[] = { 1,3 };
int p2[] = { 3,0 };
int p3[] = { 6,0 };
int p4[] = { 7,3 };
int p5[] = { 6,6 };
int p6[] = { 3,6 };
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.6,0.5,0.2);
glPointSize(3);
//glBegin(GL_POINTS);
//glBegin(GL_POLYGON); //画多边形
glBegin(GL_TRIANGLES); //画三角形(3个顶点)
//glBegin(GL_QUADS); //画四边形
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glVertex2iv(p6);
glEnd();
glFlush();
}
void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-10, 20, -10, 20); //可视的范围,类似鼠标滚轮的远近
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(300, 100);
glutInitWindowSize(600, 500);
glutCreateWindow("Lines | Triangle");
init();
glutDisplayFunc(polgonTriangle); //传递需要的函数
glutMainLoop();
return 0;
}
# 安装opengl
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev g++
创建多面体程序:
#include <GL/glut.h>
#define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
static int angle = 0;
static int rotateMode = 0;
void myDisplay(void)
{
static int list = 0;
if (list == 0)
{
GLfloat
PointA[] = { 0.5f, 0.5f, -0.5f },
PointB[] = { 0.5f, -0.5f, -0.5f },
PointC[] = { -0.5f, -0.5f, -0.5f },
PointD[] = { -0.5f, 0.5f, -0.5f },
PointE[] = { 0.5f, 0.5f, 0.5f },
PointF[] = { 0.5f, -0.5f, 0.5f },
PointG[] = { -0.5f, -0.5f, 0.5f },
PointH[] = { -0.5f, 0.5f, 0.5f };
GLfloat
ColorA[] = { 1, 0, 0 },
ColorB[] = { 0, 1, 0 },
ColorC[] = { 0, 0, 1 },
ColorD[] = { 1, 1, 0 },
ColorE[] = { 1, 0, 1 },
ColorF[] = { 0, 1, 1 },
ColorG[] = { 1, 1, 1 },
ColorH[] = { 0, 0, 0 };
list = glGenLists(1);
glNewList(list, GL_COMPILE);
// 面1
glBegin(GL_POLYGON);
ColoredVertex(ColorA, PointA);
ColoredVertex(ColorE, PointE);
ColoredVertex(ColorH, PointH);
ColoredVertex(ColorD, PointD);
glEnd();
// 面2
glBegin(GL_POLYGON);
ColoredVertex(ColorD, PointD);
ColoredVertex(ColorC, PointC);
ColoredVertex(ColorB, PointB);
ColoredVertex(ColorA, PointA);
glEnd();
// 面3
glBegin(GL_POLYGON);
ColoredVertex(ColorA, PointA);
ColoredVertex(ColorB, PointB);
ColoredVertex(ColorF, PointF);
ColoredVertex(ColorE, PointE);
glEnd();
// 面4
glBegin(GL_POLYGON);
ColoredVertex(ColorE, PointE);
ColoredVertex(ColorH, PointH);
ColoredVertex(ColorG, PointG);
ColoredVertex(ColorF, PointF);
glEnd();
// 面5
glBegin(GL_POLYGON);
ColoredVertex(ColorF, PointF);
ColoredVertex(ColorB, PointB);
ColoredVertex(ColorC, PointC);
ColoredVertex(ColorG, PointG);
glEnd();
// 面6
glBegin(GL_POLYGON);
ColoredVertex(ColorG, PointG);
ColoredVertex(ColorH, PointH);
ColoredVertex(ColorD, PointD);
ColoredVertex(ColorC, PointC);
glEnd();
glEndList();
glEnable(GL_DEPTH_TEST);
}
// 已经创建了显示列表,在每次绘制正四面体时将调用它
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle / 10, 1, 0.5, 0.0);
glCallList(list);
glPopMatrix();
glutSwapBuffers();
}
void myIdle(void)
{
++angle;
if (angle >= 3600.0f)
{
angle = 0.0f;
}
myDisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(700, 700);
glutCreateWindow("First OpenGL Program");
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle); //空闲调用
glutMainLoop();
return 0;
}
编译运行:
g++ -o main main.cpp -lglut -lGLU -lGL && ./main