OpenGL(1)入门简介
什么是OpenGL
OpenGL(Open Graphics Library, 开放式图形库)。我们常用的平时使用的库包括:
- gl:核心库;以gl开头,包含了最基本的3D函数。
- glu: 实用库;对gl的部分封装,起辅助作用;如果算数好,不用glu的情况下,也是可以做出同样的效果;以glu开头,包含纹理、坐标、基本形状等;
- glaux: 辅助库;包含窗口、输入输出、基本形状;
- glut: (OpenGL Utility Toolkit)实用工具库,替代(aux);基本的窗口界面,独立于gl和glu;以glut开头,包括窗口、输入输出、字体、图像等。
- freegult:glut的一个开源版本;
- glfw: 实用工具库,轻量级跨平台攻库,提供了一些渲染物体所需的最低限度接口;管理窗口、读取输入、处理事件;
- glew:
- 跨平台的openglC++拓展库;
- 自动识别平台所支持的opengl高级拓展函数;
- 包含glew.h头文件,就能实用gl, glu, glext, wgl,glx的全部函数。
- glad:
作用于glew类似,因此两者不能同时使用。glad可以看作glew的升级版。 - 窗口库:
- glx: OpenGL的X窗口系统拓展(如Ubuntu等带界面的linux系统);
- agl: OpenGL的apple窗口拓展;
- wgl: openGL的windows窗口拓展;
一般常用的组合,可以总结为,窗口 + OpenGL跨平台拓展库。因此有以下配合:
- freeglut + glew
- glfw + glew
- glfw + glad
- 窗口库() + glew 或者 窗口库() + glad;
这种使用方式一般是要与一些GUI库一起使用,开发应用新软件,比如MFC 、 Qt 等等 - 一些GUI库也集成了OpenGL库,比如Qt
小结
上面总结了大家在在基于OpenGL开发时常用的库。从这点看,很多人都会认为是在面向接口编程,以为OpenGL是一个API(Application Programming Interface, 应用程序编程接口)。其实不然,它以两种形式存在:
- 第一种形式,它仅仅是一个由Khronos制定定并维护规范(Specification)。所有版本的OpenGL规范文档都被公开的寄存在Khronos那里这是OpenGL3.3的规范。它只是定义了OpenGL API以及OpenGL 整个状态机
- 第二种形式, OpenGL的实现。开发人员根据OpenGL的规范,实现我们现在使用库里的功能。而这些实现一般由显卡开发商提供。如果你使用的某个函数功能,却没有实现应有的效果,在参数设置无误的情况下,那就是显卡产商提供的实现有bug,这时可以通过更新电脑的显卡驱动,看是否能解决这个问题。
OpenGL拓展(Extension)机制
既然OpenGL的第二种形式是依靠各大显卡产商根据OpenGL实现,而且各大硬件厂商在市场上竞争如此激烈,那么硬件提供商在图形方法学以及特效方面必须拥有持久的创新力的。因此,OpenGL允许硬件厂商通过它的拓展机制进行创新。那我们在使用OpenGL新特性或者渲染上的大优化功能时,就需要通过查询当前显卡是否支持。
/*查询当前支持多少拓展*/
GLint nNumExtension;
glGetIntegerv(GL_NUM_EXTENSIONS, &nNumExtension;)
for(int i = 0; i < nNumExtension; i++)
{
/*是否支持windows上交换拓展*/
if(strcmp("WGL_EXT_swp_control", (const char*)glGetString(GL_EXTENSIONS, i)) == 0
{
/*实现拓展的内容*/
}
}
OpenGL渲染模式
- 立即渲染模式(Immediate mode),也称固定渲染线管。固定渲染线管,它的特点是容易使用,而且非常方便。因为固定线管把很多功能都隐藏起来,开发者可以不用去理会很多细节的地方。但是在便利背后,却有着无法掌控细节,性能得不到优化等缺点。OpenGL3.2开始分成了核心框架和完整框架,核心框架移除了任何老旧特性,
- 核心框架模式,可以让我们知道OpenGL是如何运作的,理解图形编程。并且提供很多灵活高效的的图形编程。在核心框架中,无论我们实现什么,都需要编写一个着色器。这样处理起来虽然比固定线管麻烦一些,但收益是可观的。
因此,后面几何都会使用OpenGL核心框架模式,也就是OpenGL3.2以上版本。
OpenGL 状态机
OpenGL使用了一种状态模型(或者称为状态机[State Machine])来追踪所有OpenGL的状态变量。另外,OpenGL的状态通常被称为OpenGL上下文(Context)。可以简单理解为大部分状态都是一些开关,如深度测试状态,要么打开,要么关闭(但也不是所有状态都是打开关闭)。
具体使用,当一个状态值被设置后,它就一直保持这个状态,这时我们当前的OpenGL上下文(Context)进行渲染,渲染完成后再关闭这个状态。
举例:
/*开光状态*/
void glEnable(GLenum capability);
void glDisable(GLenum capability)
/*设置变量值*/
void glGetBooleanv(GLenum pname, GLbool *parama);