您的位置:首页 > 运维架构

OpenGL与红宝书第八版第一个程序配置

2016-03-01 11:10 337 查看
本文档参考文献为《OpenGL编程指南》(原书第8版)中文版。

 

下面直接讲解笔者接触并初学OpenGL之路。

由于笔者学习方向的关系,有时接触到某些开源框架的时候,里面涉及到OpenGL。当然了,我那时不是用OpenGL啦,只是当时用的开源框架涉及到OpenGL罢了。而OpenGL其实是比较复杂而且神秘的底层类库,因此当时见到OpenGL那部分复杂的代码的时候,我就直接跳过,只要不影响我使用那个开源框架就行了。

过了很久,我发现自己的学习出现了瓶颈,就是因为对OpenGL的不熟悉阻碍了进一步学习,因而使我觉得有必要学习OpenGL。

由于网上对OpenGL的介绍凌乱不堪,于是我觉得有必要买一本OpenGL的经典书籍来参考一下,于是就买了红宝书第8版中文版了。

我看了一下开头,根据书里的叙述,第8版的图文内容与之前的修订版基本不存在关联,因此这一版是全新的一版。

 

然而它的叙述却存在着明显的问题。

 

首先,对OpenGL的历史一笔带过,然而这个不是重要问题。最重要的是,它没有明确地说明OpenGL与操作系统(平台)之间的关系,以及OpenGL程序的编写在各个平台上应该怎么搭建编程环境。以我之前阅读过一些经典书籍的经验,这都是必须要说明的呀,然而红宝书都第8版了,都没有这样的意识。这使得我非常郁闷,因为这样说得不清不楚会使得初学者非常困惑。

 

下面会对一些重要问题作讲解。

 

OpenGL与Windows操作系统有什么关系?

 

OpenGL是一种应用程序编程接口(API),也是一种可以对图形硬件设备特性进行访问的软件库。因而事实上,OpenGL其实与显卡的关系更密切一些,而对于支持OpenGL的显卡才能使用OpenGL库。

由于OpenGL与显卡(硬件)有关,因而也与操作系统有关,所以Windows是自带OpenGL的,因此Windows会包含OpenGL的标准库,而在OpenGL官网是找不到下载的。

当我们安装了编译器(例如VS2010)后,编译器会把OpenGL的相关头文件和类库复制入编译器的相关文件夹中。

例如头文件放在C:\ProgramFiles (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl

库文件放在C:\Program Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib

 

Windows中OpenGL的版本过低怎么办?

 

这个不用担心,用Windows自带的OpenGL已经足够了。OpenGL版本的限制其实是在于显卡支持的OpenGL版本而不是你本身的OpenGL库的版本。

 

那怎么查看显卡支持
4000
的OpenGL版本呢?一种是通过编程的方式,但是我们刚接触不会编程,那怎么办呢?可以采用第二种方式,下载一个OpenGLExtension Viewer,如下图所示:

 


笔者用的电脑是实验室的电脑,2009年买的,显卡也已经支持OpenGL4.4了。
 
那怎么让系统使用比较新的OpenGL库进行编程呢?我们还需要第三方软件库GLUT和GLEW。所谓第三方软件库是指,其代码不是OpenGL官方写的。但是这两个库都受到广泛的使用,也受到官方的认可。
 
GLUT库下载地址:http://www.transmissionzero.co.uk/software/freeglut-devel/
GLEW库下载地址:http://glew.sourceforge.net/
 
选择合适的版本进行下载,可参考http://blog.sina.com.cn/s/blog_7cfb366d01012icr.html
 
 
由于笔者使用红宝书里面的程序,因此笔者直接从红宝书官网下载源代码的时候就已经附带了这些类库,因此笔者就不从上面的链接中下载所需软件库了。
 
笔者把源代码解压放到D:\opengl中,如图所示

 


但是官网没有提供第一个OpenGL程序的源代码,怎么办呢?难道要一个一个代码敲进去?(作者还旅游去了,有这么不负责任的作者吗?)
当然不用了,网上绝对有某个勤奋好学的好孩子把代码贴到自己的博客上。百度一下,果然,找到了一个博客:
 
http://blog.csdn.net/candycat1992/article/details/39676669
 
然后我把上面的代码按照红宝书里面的叙述,做成三个文件,如图所示:

 


然后在VS2010中新建一个项目:

 


然后把之前的三个文件triangles.cpp、triangles.vert、triangles.frag,以及D:\opengl\oglpg-8th-edition中的LoadShaders.h、vgl.h、LoadShaders.cpp(不在第一级目录中,可自己搜索一下)复制到D:\opengl\triangles\triangles中,如图所示:

 
 


然后在VS2010中添加相应的头文件和源文件(这个是基本功,不会的百度)

 


 
注意到vgl.h中,无法加载源文件”GL/glew.h”,这是因为我们没有设置附加包含文件,而且我们注意到,头文件中指定了所需的静态库“glew_static_vs2010.lib”,从而静态库的名字也指定,后面还有"freeglut_static_vs2010.lib",这样的名称是红宝书源代码特有的,通常从官网下载下来的名称是“glew32.lib”和“freeglut.lib”,而且还是动态库,我们也不妨可以像这样一样先查看一下头文件。

 


选择triangles解决方案>>右键>>属性>>C/C++>>常规,修改附加包含目录,如图所示:

 


选择triangles解决方案>>右键>>属性>>链接器>>常规,修改附加库目录,如图所示:

 


然后编译,如图所示:



 
然后出现了很多错误,但注意到一个警告:

 


由此推测,这些错误都是由默认库“libcmtd.lib”与其他库冲突造成的,因此我们必须要忽略这一个库。
 
选择triangles解决方案>>右键>>属性>>链接器>>输入,忽略特定默认库,填入LIBCMT;LIBCMTD,这样在debug或release编译模式下都能把这个库忽略掉。

 


 
 
选择确定后,我们再进行编译,最后编译成功了:

 


顿时感觉之前那个博客的博主难道没遇到这样的问题吗?博主解决这个问题应该也历尽千辛万苦吧,为什么一点也没提到。从而感觉博主虽然勤奋,但写文章还是不清晰,忽略每一个关键步骤都会使得初学者不知所措啊。
 
然后键盘输入CTRL+F5,开始执行(但不调试),程序竟然崩溃:

 


这里我就纳闷了,以我几年来的编程经验,应该没问题的!但这里竟然出问题了,而博主在博客上又没有贴这个问题,感觉自己的脸都丢光了。
 
为了维护自己的尊严,我认为这个问题应该出现在自己身上,因此自己调配置调了一个晚上,但结果还是不行!当时的心情,回想起来都觉得心烦。
 
到了第二天,我觉得难道是代码的问题?质疑的矛头直接指向了红宝书,我开始觉得有可能红宝书的代码有问题。
 
于是我对程序运行调试(F5),程序中断在一条语句上:

 


从而是这条语句引起了崩溃,于是就百度了一下,发现很多人都有这样的问题,于是我找到了解决方案:http://blog.csdn.net/zsq306650083/article/details/49660409
 
原来只要在glewInit()前加入glewExperimental= GL_TRUE;即可,如图所示

 


重新编译,运行,成功:

 


从而可知这的确是红宝书的问题,因此有时也要质疑权威,但是错得比较多的还是博主。
 
最后再提一点,triangles.cpp中有一条语句glutInitContextVersion(4,3);指定OpengGL的版本为4.3,因此如果显卡的OpenGL版本不够高的话,应作修改,但如果是红宝书的代码,那必须保证在3.3及以上的版本才可能没报错地运行。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: