官方网站:https://opengl.org/
官方网站中给了由用户贡献的教程和入门指南
推荐面向初学者的容易理解的现代OpenGL教程
https://learnopengl.com/
对应的中文网站:https://learnopengl-cn.github.io/intro/
OpenGL被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。开发实际 OpenGL 库的人通常是显卡制造商。您购买的每张显卡都支持特定版本的 OpenGL
OpenGL函数库相关的API有核心库(gl),实用库(glfw),实用工具库(glut ,已被freeglut代替),窗口库(glx、agl、wgl),辅助库(aux)和扩展函数库等。
ubuntu下opengl的安装十分方便,直接命令行安装
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglfw3 libglfw3-dev
sudo apt-get install freeglut3 freeglut3-dev
sudo apt-get install libglew-dev
GLUT是 OpenGL 实用程序工具包,一个用于编写 OpenGL 程序的独立于窗口系统的工具包。它为 OpenGL 实现了一个简单的窗口应用程序编程接口 (API)。GLUT 使学习和探索 OpenGL 编程变得相当容易。GLUT 提供了一个可移植的 API,
但是版本太老了,理应被时代淘汰版本太老了,理应被时代淘汰,不推荐使用。gult最后版本v3.7beta的历史可追溯至1998年8月,且该项目已经被废弃。它的许可证禁止任何人发布修改后的库代码
GLUT - The OpenGL Utility Toolkit
freeglut完全兼容glut,是glut的代替品,开源,功能齐全。目前来看,freeglut 3.0版本比其它版本稳定,推荐使用。目前,该项目几乎可以100%的替代原来的GLUT,只有少数差别。
https://freeglut.sourceforge.net/
glut或者freegult主要是OpenGL 1.0的基本函数功能;glew是使用OpenGL 2.0之后的一个工具函数。glew的作用是自动识别所支持的全部OpenGL高级拓展函数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。
https://glew.sourceforge.net/
glfw 是一个用于 OpenGL、OpenGL ES 和 OpenGL ES 的开源多平台库 。它提供了一个简单的 API,用于创建 窗口、上下文和图面,接收输入和事件。glfw的开发目的是用于替代glut的。
https://www.glfw.org/
glad是继gl3w,glew之后,当前最新的用来访问OpenGL规范接口的第三方库。简单说glad是glew的升级版。 GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD,从而让我们能够使用所有OpenGL函数
https://glad.dav1d.de/
//Test.cpp
#include
#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++ test.cpp -o test -l GL -l GLU -l glut
./test
出现如下照片,证明安装成功
参考资料:
开源项目推荐:OpenGL之gult/freeglut/glew/glfw/glad的联系与区别