刚接触OpenGL不久,由于工作及学习需要,涉及这方面知识开始从零学习。之前曾大致了解过OpenGL(Open Graphics Library)是专业的图形程序接口,是可用于二维或三维的图形绘制、动画显示等的底层图形库。具体的功能研究请参考其官方网站,本文只提供本人在接触OpenGL后从无厘头到初步摸到学习门路的心得体会,作为新手,希望能够为想要学习OpenGL的朋友们提供一些踏入门槛的知识和心得。
本人在学习OpenGL过程中算是走了些许弯路的,之后在学习过程中,觉得学习OpenGL一定要耐得住性子,毕竟在网上看了很多相关的帖子,很多新手对OpenGL都存在某种畏惧感,包括之前的我。
本人觉得在刚接触OpenGL时,首先要做的还是耐心跑几个简单的程序,看看OpenGL是怎么工作的,从感官上感受一下,然后就是重点要了解一下OpenGL相关的库的介绍,相关文章很多,本人在接触的过程中觉得很多文章介绍的很详细,但正由于太过详细,导致很多人记不住,也难以下手,起码我的大脑过两天就差不过扔掉了。
对于OpenGL库,我们是为了用其开发应用程序,其跨语言、跨平台的强大接口为我们提供了相当灵活使用的空间,但从另一方面来说,其具有这样的属性,也就决定了其对于不同的硬件平台,需要采用不同的窗口系统,其核心API没有窗口系统,所以很多朋友在刚接触时,想跑个简单的程序可能都要烦恼很久,不过这时就得静下心来慢慢一点点的摸索,这是必不可少的过程。
本文的主要想法就是在最基本的概念上介绍一下OpenGL函数库,注意,不是库函数,库函数还是在使用过程中一点点的积累,参考相关书籍慢慢摸索才是王道。
OpenGL函数库相关的API包括核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。核心库(gl)是核心,实用库(glu)是对gl的部分封装。窗口库(glx、agl、wgl)是针对不同窗口系统的函数。实用工具库(glut)是OpenGL提供的一个程序工具包,比辅助库(aux)功能强大。有文章说glut由于其功能强大,便于开发更强大的功能可以代替核心库(gl)和实用库(glu)的学习,本人觉得不能完全赞同,程序员应该都明白一点,对于库这样非开源的代码,强大的功能只能让我们更容易开发一些强大的功能,但其封装了底层大量的基础代码,明显在某些使用场合会降低代码使用的灵活性,在编程过程中可能会使代码显得更加臃肿,这里仅仅是本人作为初学者的观点,若有问题,可不采纳,仅供参考。下面简单介绍一下本人觉得作为初学者所必须了解且很多书本上写的不够详细的基础知识。
1、OpenGL核心库(GL)
核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。由于许多函数可以接收不同类型的参数,因此派生出来的函数原形多达300多个。核心库在Windows平台上的头文件为"GL.H",库文件为"OPENGL32.LIB",动态链接库为"OPENGL32.DLL"。核心库可以在所有的OpenGL平台上运行。
这里给出其动态库依赖关系,可以看出OPENGL32.DLL依赖库中,有GLU32.DLL,这两个动态库一般存放在电脑系统盘的系统文件中,不稍微研究一下,很难在资料上找到其相关的详细说明。
2、OpenGL实用库(GLU)
实用库包含有43个函数,函数名的前缀为glu。OpenGL的实用函数是比OpenGL核心函数更高一层的函数,这些函数是通过调用核心函数来起作用的。这些函数提供了十分简单的用法,从而减轻了开发者的编程负担。OpenGL的实用函数包括纹理映射、坐标变换、多边形分化、绘制一些如椭球、圆柱、茶壶等简单多边形实体等。这部分函数象核心函数一样在任何OpenGL平台都可以应用。 实用库在Windows平台上的头文件为"GLU.H",库文件为"GLU32.LIB",动态链接库为"GLU32.DLL"。
可以看到,GLU32.DLL的依赖库中也包含了OPENGL32.DLL,它们是相互依赖的。
3、OpenGL辅助库(AUX)
辅助库包含有31个函数,每个函数以aux开头。OpenGL的辅助库是一些特殊的函数,这些函数本来是用于初学者做简单的练习之用,因此这些函数不能在所有的OpenGL平台上使用,在Windows NT环境下可以使用这些函数。这些函数使用简单,它们可以用于窗口管理、输入输出处理以及绘制一些简单的三维形体。为了使OpenGL的应用程序具有良好的移植性,在使用OpenGL辅助库的时候应谨慎。 笔者建议,辅助库作为初学时了解OpenGL相关库函数使用的时候用,在跨平台使用中,其很大程度上已经被glut库取代。辅助库(AUX)在Windows平台上的头文件为"GLAUX.H",库文件为"GLAUX.LIB",动态链接库为"GLAUX.DLL"。
现在其动态库GLAUX.DLL已经不常使用了,静态链接其GLAUX.LIB使用其基本功能用户窗口管理还是可以的,用来学习比较合适,如果在高版本的平台上,可以这样做,不过对于一些低版本的平台上,可能还得查找其动态库才能够使用。(笔者所用平台为VS2015、VS2017,这里没有验证过)。
4、OpenGL工具库(GLUT)
工具库包含大约30多个函数,函数名的前缀为glut。其是不依赖于窗口平台的OpenGL工具包,目的是隐藏不同窗口平台API的复杂度,也可以用此工具库来学习OpenGL。工具库在Windows平台上的头文件为"GLUT.H",库文件为"GLUT32.LIB",动态链接库为"GLUT32.DLL"。
5、Windows专用库
专用库约有16个函数,函数名的前缀为wgl。WGL函数是用于连接OpenGL和WindowsNT,这些函数用于在WindowsNT环境下的OpenGL窗口能够进行渲染着色,在窗口内绘制位图字体以及把文本放在窗口的某一位置等。这些函数把Windows和OpenGL揉合在一起。 这部分函数用于弥补OpenGL在文本方面的不足。专用库只能用于Windows环境中。其头文件、库文件及动态库文件都和Windows GDI一样,由Windows底层提供,头文件是"wingdi.h"。
6、X窗口专用库(GLX)
X窗口专用库是针对Unix和Linux的扩展库,函数名的前缀为glx。主要包括渲染上下文、绘制图元、显示列表、纹理贴图等,笔者是做Windows平台程序开发的,这部分相对没有使用经验。
本文最后对上述内容做简单总结。
核心库 | 实用库 | 辅助库 | 工具库 | win窗口库 | 扩展库 | |
.h | GL.H | GLU.H | GLAUX.H | GLUT.H | wingdi.h | glext.h、wglext.h |
.lib | OPENGL32.LIB | GLU32.LIB | GLAUX.LIB | GLUT32.LIB | ||
.dll | OPENGL32.DLL | GLU32.DLL | GLAUX.DLL | GLUT32.DLL |
OpenGL程序开发中,常用的函数库组合:
1、GL+GLU+GLUT(跨平台)
窗口绘制GLUT,采用GLUT的消息处理机制;
图形绘制GL+GLU+GLUT中的绘制函数。
2、GL+GLU+WGL(仅限于Windows程序)
窗口绘制WGL,采用Windows的消息处理机制;
图形绘制GL+GLU+WGL中的绘制函数。
笔者为OpenGL初学者,希望能与各位朋友一起学习,文中若存在问题,希望大神指出修正。