OpenGL系列教程(1)——认识OpenGL

来源:互联网 发布:詹姆斯生涯数据统计 编辑:程序博客网 时间:2024/05/21 15:48
写在前面
写这个系列教程一方面是为了帮助我自己巩固、理解OpenGL和计算机图形学的知识,提升自己的写作和表达能力,另一方面是为了分享自己在学习过程中收获到的成果,与作为读者的你共同进步。还有,这不是一个面向编程新手的系列教程,因此在学习该教程前,我假定你已十分熟悉C/C++语言,或者至少对编程的基本概念有所了解。全篇教程主要基于Windows平台。

下面我以FAQ的形式给出OpenGL的简介,内容翻译自OpenGL Wiki,原文地址:https://www.khronos.org/opengl/wiki/FAQ
1.什么是OpenGL?
        OpenGL,全称Open Graphics Library,直译为开放式图形库。字面上不难理解这就是一个图形库,专门给程序开发人员编写图形程序用的。OpenGL可以渲染(也可称为绘制,后续教程全部使用“渲染”一词)2D和3D的图形,而且通常是3D居多。如果你曾经用过一些C的第三方库,你大概能想到OpenGL就是若干个头文件+一个导入库文件+一个动态链接库文件组成的东西。也就是说,你在代码中引入OpenGL的头文件,在工程中引入OpenGL的导入库,便能调用OpenGL的函数来编写图形程序。
        请注意,OpenGL虽然被称为图形库,实际上只是一个规范(Specification),也就是类似于协议一样的东西。OpenGL的制定委员会并没有设计OpenGL的实现代码,他们做的只是声明了OpenGL应该具有哪些函数,这些函数之间应该如何协调工作,以及定义了OpenGL的整个渲染过程。而实质上的代码实现是由各大显卡厂商和操作系统开发商完成的。
        由于OpenGL是一个规范,因此没有平台限制,这也就是为什么OpenGL是跨平台的原因。同样一份OpenGL代码,可以在Windows上编译,也能在Linux上编译。 
2.什么不是OpenGL?
        或许你可能知道GLUT和GLEW库,并且认为他们是OpenGL的一部分,实则不然。GLUT和GLEW并不属于OpenGL。OpenGL的所有API只是为了渲染图形做准备的,并没有提供窗口初始化、动画、文件读写、图像处理的功能,OpenGL只考虑如何绘图。
        GLUT是一个针对OpenGL专门设计的操作系统API简化库,能为OpenGL渲染创建窗口,响应设备输入,执行渲染循环等,它是跨平台的;GLEW是一个OpenGL加载库,关于GLEW,后面还会详细介绍。PS:本系列教程将使用GLFW替代GLUT,而使用GLEW作为加载库。
3.OpenGL是否开源?
        不,OpenGL根本就没有源代码。之前已经说过了,OpenGL就是一个规范,其实现是由其他组织完成的。
4.我能从哪里下载OpenGL?
        如同之前“OpenGL是否开源”一问的回答,OpenGL就是一个规范,不是什么软件产品,因此它没有下载地址。
        你只需要更新你的显卡驱动,就能获得最新的OpenGL动态链接库。而在MacOS X上,苹果已经实现了OpenGL的代码,在Xcode中可以直接使用。
5.OpenGL有SDK吗?
        遗憾的是,OpenGL并没有官方的SDK。但是,许多显卡厂商有他们自己的SDK,但并不是你所想象的OpenGL的SDK。

以上是OpenGL的简介。

以下是需要补充的内容(整理并翻译自OpenGL Wiki)

OpenGL没有下载地址,没有SDK,也不开源,那我们怎么开发OpenGL程序?
之前提到了OpenGL的实现是由显卡厂商和操作系统开发商实现的,顺着这一条思路,可以认识到,我们应该找Microsoft和NVIDIA(或者AMD)索要OpenGL的库。事实上也的确如此,微软在每一个Windows操作系统上都有布置OpenGL的动态链接库:opengl32.dll,你可以在系统文件夹下找到它。而Windows SDK自带OpenGL的导入库(opengl32.lib)和头文件(gl.h),你大可放心地在工程中直接include头文件,在工程中直接引入导入库。

那么OpenGL是如何在Windows上工作的呢?
首先要指出,所有主流的Windows版本都支持OpenGL。
当你编译程序时,你的程序会和opengl32.dll链接,甚至是在64位操作系统上。
当你运行你的程序时,你的程序会加载opengl32.dll,并且会检查系统注册表,看看是否有真正的OpenGL驱动存在。如果有,它便会加载之。比如AMD的OpenGL驱动,在系统目录中会以atioglxx.dll的类似字样出现,或者NVIDIA的nvoglv32.dll,实际名称以显卡驱动号为准。
微软的opengl32.dll只直接开放了OpenGL1.1版本的API,如果你想获得更高版本的API,需要使用wglGetProcAddress函数(这是一个Win32 API)。其他的,有一些第三方库也能帮你完成这件事,比如GLEW。当然,我并不推荐你直接使用
wglGetProcAddress手动地获取OpenGL高版本的API,请使用GLEW代替之,这也是GLEW存在的意义。
需要注意的是,opengl32.dll是属于微软的,没有任何人可以修改它,除了微软。你绝不能拿其他人的opengl32.dll替换你的,也绝不能把opengl32.dll和你的应用一起发送给用户。当然你也绝不能把nvoglv32.dll发给你的用户(笑)。
如果用户不能运行你的程序,提示缺少opengl32.dll或者其他驱动,那是用户的责任,你大可放心的告诉他,他该升级显卡驱动了。 

详细说明一下刚才提到的GLEW。
类似于GLEW的库统称为OpenGL加载库,也称为扩展加载库。OpenGL加载库是一种在运行时动态获取OpenGL API指针的函数库。实际上,大部分平台都要求开发者
必须以获取函数指针的方式来访问1.1以上版本的OpenGL API。在不同平台上,OpenGL API指针的获取方式都不同,而且有时特别繁琐,因此诞生了GLEW这种可以一键加载高版本OpenGL的函数库。GLEW是一个跨平台的OpenGL加载库,支持Windows,MacOS X和Linux。在你创建好OpenGL的渲染环境后,你便可调用glewInit()函数来加载高版本的OpenGL API。需要注意的是,如果你使用了OpenGL加载库,那你就不应该再包含gl.h和glext.h文件了。甚至,如果在glew.h之前包含gl.h,会导致编译器报错。gl.h中只包含了OpenGL1.1的API,wglGetProcAddress属于Win32 API,存在于Windows.h中。
0 0
原创粉丝点击