OpenGL是一个应用程序编程接口API,其实就是一个方便访问计算机图形硬件的封装库。
有几个概念需要说下:
模型:由几何里点线面组合而成的数据集
渲染:计算机从模型创建出图形的过程。
着色:被编译为GPU执行的代码。Opengl包含编译工具,把着色的源码编译。
OpenGL是一个操作计算机图形的集合,它包含多种库。常见的如glfw、glut、freeglut等。
本文通过下载freeglut来初步学习了解其原理。
1 下载安装
freeglut库里面有两个版本,都包含32和64位的,根据Qt的配置自己选择:
下载地址:http://www.transmissionzero.co.uk/software/freeglut-devel/
2 配置
msvc环境配置(64位):
1) .解压后将freeglut文件中的bin文件下的x64文件下的freeglut.dll,拷贝至QT的安装路径 D:\Qt\Qt5.2.4\5.2.4\msvc2017_64\bin目录下;
2) .解压后将freeglut文件中的include文件下的GL文件夹,拷贝至QT的安装路径D:\Qt\Qt5.2.4\5.2.4\msvc2017_64\include目录下;
3) .解压后将freeglut文件中的lib文件下的x64文件下的freeglut.lib,安装路径D:\Qt\Qt5.2.4\5.2.4\msvc2017_64\lib目录下;MinGW环境配置(32位版本):
1) .解压后将freeglut文件中的bin文件下的freeglut.dll,拷贝至QT的安装路径D:\Qt\Qt5.2.4\5.9.4\mingw53_32\bin目录下;
2) .解压后将freeglut文件中的include文件下的GL文件,拷贝至QT的安装路径D:\Qt\Qt5.2.4\5.2.4\mingw53_32\include目录下;
3) .解压后将freeglut文件中的lib文件下的libfreeglut.a、libfreeglut_static.a文件,拷贝至QT的安装路径D:\Qt\Qt5.2.4\5.2.4\mingw53_32\lib目录下;
上面那样配置的好处是在编译的时候可以不用 -LD:/Qt/Qt5.9.2/5.9.2/msvc2017_64/lib 指定库的目录,方便使用。
3 使用
#第三种就是多个库在同一个文件夹下的时候,连接使用
LIBS += -LD:/Qt/Qt5.9.2/5.9.2/msvc2017_64/lib -lfreeglut -lOpenGL32MinGW版本:
win32:LIBS += -lOpengl32 \
-lglu32 \
-lglut \
-lfreeglut使用库时没有前缀lib及后缀.a .lib,但有前缀-l
最后在cpp中加入#include <GL/glut.h>,这样就可以使用glut中的函数了。
附上使用的源码:
#include "GL/glut.h"
// 初始化参数
void init() {
glClearColor(0.1, 0.1, 0.4, 0.0);
glShadeModel(GL_SMOOTH);
}
// 绘图回调函数
void display() {
// 清除之前帧数据
glClear(GL_COLOR_BUFFER_BIT);
// 绘制三角形
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0);
glVertex3f(-1, -1, -5);
glColor3f(0, 1, 0);
glVertex3f(1, -1, -5);
glColor3f(0, 0, 1);
glVertex3f(0, 1, -5);
glEnd();
// 执行绘图命令
glFlush();
}
// 窗口大小变化回调函数
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.1, 100000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, const char * argv[]) {
// 初始化显示模式
glutInit(&argc, const_cast<char **>(argv));
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
// 初始化窗口
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
// 开始主循环绘制
glutMainLoop();
return 0;
}