OpenGL简介

作者:追风剑情 发布于:2019-6-1 10:05 分类:OpenGL

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

EXT_前缀表明这个扩展(假定)是与特定提供商无关的,并且得到众多的支持。

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包管理器安装
1111.png

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包管理器安装
1111.png
1111.png

GLTools
GLTools包含一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL 3.3中用来产生和渲染一些简单3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。(这个库是作者自己写的)
GitHub GLTools源码
在Visual Studio中编译GLTools源码
1、增加预处理宏_CRT_SECURE_NO_DEPRECATE
1111.png
2、添加glew静态库、freeglut静态库(右键->添加->现有项...)
1111.png

编译GLTools源码

3、添加GLTools的头文件路径到附加包含目录
1111.png


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、配置静态链接库

1111.png

Visual Studio 2017配置OpenGL

查看电脑GPU信息

11111.png


更多学习资料

https://learnopengl-cn.github.io/
《OpenGL超级宝典》源码下载地址

标签: OpenGL

Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号