OpenGL是一组图形硬件的一种软件接口。
OpenGL体系结构审核委员会(ARB, OpenGL Architecture Reiview Board)。
OpenGL的姊妹API——OpenGL ES
OpenGL是跨平台和可移植的,并且几乎现有的所有3D硬件设备都有对应的OpenGL驱动。
OpenGL 3.0仍然兼容Open GL 2.1
OpenGL 3.1从核心规范中移除了不鼓励使用的特性,同时引入了一个新的OpenGL扩展GL_ARB_compatibility。但,NVIDIA并未在此版本移除任何老旧功能。
OpenGL 3.2废除了GL_ARB_compatibility扩展,取而代之地将OpenGL分成了核心框架和完整框架。核心框架规范将更加精简,并且不包含任何老旧的“不鼓励使用”功能。规范的一致性要求具有核心功能,但将兼容框架列为可选项。
OpenGL允许提供商通过它的扩展机制进行创新。glext.h中包含了所有扩展。
查询支持的扩展
GLint nNum;
glGetIntegerv(GL_NUM_EXTENSIONS, &nNum);
for(GLint i = 0; i < nNum; i++) {
//在Windows中查询交换控制扩展
if (strcmp("WGL_EXT_swap_control", (const char *)glGetStringi(GL_EXTENSIONS, i)) == 0) {
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
if (wglSwapIntervalEXT != NULL)
wglSwapIntervalEXT(1);
}
}
在GLTools库中有一个快捷工具包查扩展
int gltIsExtSupported(const char *extension);
如果支持指定的扩展,那么这个函数返回1;反之则返回0。GLTools库包含了一整套OpenGL帮助和实用工具函数。gltools.h文件包含所有的函数原型。
每个扩展都有一个由3个字母组成的前缀,这个前缀标识了这个扩展的来源。
| OpenGL扩展识别示例 | |
| 前缀 | 提供商 |
| SGI_ | Silicon Graphics |
| ATI_ | ATI Technologies |
| AMD_ | Advanced Micro Devices |
| NV_ | NVIDIA |
| IBM_ | IBM |
| WGL_ | Microsoft |
| EXT_ | Cross-Vendor |
| ARB_ | ARB Approved |
AUX
OpenGL的辅助函数库,具有跨平台性,缺点是缺乏基本的GUI特性。
GLUT
AUX渐渐被GLUT函数库所取代。GLUT代表OpenGL实用工具箱(OpenGL utility toolkit,不要与标准的GLU——OpenGL utility library,即OpenGL实用库混淆)。GLUT免费但不开源已被freeglut函数库所取代。
官网下载 freeglut
下载 freeglut-MSVC.zip
下载 freeglut-MinGW.zip
下载 freeglut-3.0.0.tar.gz
也可以通过Visual Studio NuGet包管理器安装
GLEW
OpenGL API主要通过扩展机制来发展。这种扩展机制能够用来获得指向任何加入OpenGL 1.0之后任何版本核心的OpenGL函数的函数指针。有一个实现OpenGL 3.0 API完全存取的简单方法,就是使用一个自动初始化所有新函数指针并包含所需类型定义、常量和枚举值的扩展加载库。不止一种这样的扩展加载库可供选择,其中一种维护最好的开源库是GLEW。通过驱动程序使用这种库来初始化全部可用的OpenGL功能并不太容易。我们需要在项目中添加一个单独的C源文件及头文件,并且在程序启动时调用一个单独的初始化函数。为了使事情更简单,GLEW被预先封装在了GLTools库中,实际上,GLTools库就是基于GLEW库的。
GitHub GLEW
下载 GLEW
下载 glew-2.1.0-win32.zip
也可以通过Visual Studio NuGet包管理器安装
GLTools
GLTools包含一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL 3.3中用来产生和渲染一些简单3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。(这个库是作者自己写的)
GitHub GLTools源码
在Visual Studio中编译GLTools源码
1、增加预处理宏_CRT_SECURE_NO_DEPRECATE

2、添加glew静态库、freeglut静态库(右键->添加->现有项...)
| OpenGL变量类型和最小位宽 | ||
| OpenGL数据类型 | 最小位宽 | 描述 |
| GLboolean | 1 | 布尔值,真或假 |
| GLbyte | 8 | 有符号8位整数 |
| GLubyte | 8 | 无符号8位整数 |
| GLchar | 8 | 字符串 |
| GLshort | 16 | 有符号16位整数 |
| GLushort | 16 | 无符号16位整数 |
| GLhalf | 16 | 半精度浮点值 |
| GLint | 32 | 有符号32位整数 |
| GLuint | 32 | 无符号32位整数 |
| GLsize | 32 | 无符号32位整数 |
| GLenum | 32 | 无符号32位整数 |
| GLfloat | 32 | 32位浮点数 |
| GLclampf | 32 | [0, 1]范围内的32位浮点数 |
| GLbitfield | 32 | 32位 |
| GLdouble | 64 | 64位双精度数 |
| GLclampd | 64 | [0, 1]范围内的64位双精度数 |
| GLint64 | 64 | 有符号64位整数 |
| GLuint64 | 64 | 无符号64位整数 |
| GLsizeiptr | 本地指针大小 | 无符号整数 |
| GLintptr | 本地指针大小 | 有符号整数 |
| GLsync | 本地指针大小 | 同步对象句柄 |
//声明数组
GLshort shorts[10];
//声明一个长度为10的指向GLdouble类型变量的指针数组
GLdouble *doubles[10];
OpenGL错误
GLenum glGetError(void);
需要在一个循环中调用glGetError函数,持续检查错误标志,直到返回值是GL_NO_ERROR为止。
| OpenGL错误代码 | ||
| 错误代码 | 描述 | |
| GL_INVALID_ENUM | 枚举参数超出范围 | |
|
GL_INVALID_VALUE |
数值参数超出范围 | |
| GL_INVALID_OPERATION | 在当前的状态中操作非法 | |
| GL_OUT_OF_MEMORY | 没有足够的内存来执行这条命令 | |
| GL_NO_ERROR | 没有错误出现 | |
查询OpenGL的生产商和版本号
const GLubyte *glGetString(GLenum name);
这个函数返回一个静态的字符串,描述GL函数库中所请求的信息。
设置渲染品质
void glHint(GLenum target, GLenum mode);
此函数允许我们指定偏重于视觉质量还是速度。target参数指定希望修改的行为类型,mode参数告诉OpenGL我们最为关心的是什么,例如更快的渲染速度还是最好的输出质量,或者保持默认。注意,因为所有的OpenGL实现都不要求必须在glHint函数的调用上保持一致。在OpenGL中,这是唯一一个行为完全依赖生产商的函数。
OpenGL状态机
是否混合、是否进行正面或背面剔除、是否进行深度测试等,在OpenGL中全部由状态进行控制。
//开启某个状态
void glEnable(GLenum capability);
//关闭某个状态
void glDisable(GLenum capability);
//例如,打开深度测试
glEnable(GL_DEPTH_TEST);
//例如,关闭深度测试
glDisable(GL_DEPTH_TEST);
//判断状态是否打开
GLboolean glIsEnabled(GLenum capability);
并不是所有的状态变量都只是简单地打开或关闭。
OpenGL提供了一组查询函数,可以查询布尔、整型、单精度浮点型和双精度浮点型变量的值:
void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev(GLenum pname, GLboolean *params);
void glGetFloatv(GLenum pname, GLboolean *params);
void glGetIntegerv(GLenum pname, GLboolean *params);
每个函数都返回单个值,或者返回一个数组。
Visual Studio环境配置
1、配置静态链接库
查看电脑GPU信息
更多学习资料