本文档参考文献为《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库的版本。

那怎么查看显卡支持的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及以上的版本才可能没报错地运行。

OpenGL与红宝书第八版第一个程序配置相关推荐

  1. 关于在vs2013中配置opengl红宝书第八版环境

    转自 http://blog.csdn.net/qq821869798/article/details/45247241 本人刚开始学习opengl,买了一本opengl红宝书第八版, 第一个例子研究 ...

  2. OpenGL编程指南 (红宝书 第八版) 样例代码配置问题汇总

    代码下载 环境配置问题glut 和 glew1 基本头文件和库文件配置2 以下是正文内容 第一个渲染程序Triangles3 第三章 03ch03_drawcommands4 本文是笔者自己在配置中遇 ...

  3. 2013年CISA中英对照题目解析合集国盟官方(红宝书第四版)

    2013年CISA中英对照题目解析合集国盟官方(红宝书第四版) 本书为国际信息安全学习联盟(简称国盟)CNCISA(中国CISA)家园历年发布的中文对照题目解析合集(红宝书)第四版.本书的目的在于向C ...

  4. 用最简单的方法配置运行OpenGL红宝书第9版源码示例

    笔者真是苦逼啊,之前花了很多时间去学习"基于OpenGL的图形学"的开头部分,包括书本和老师的PPT.但是到自己尝试编译运行示例代码的时候真是困难重重.而且!在自己胡乱摸爬滚打终于 ...

  5. JavaScript 红宝书第4版上市啦!「文末送几本给大家」

    文末有活动 人的一生中总要读几本经典书,在这个"经典"泛滥的年代,什么才是权威的代表,我想大概是一本的书的口碑,能积累下上佳口碑的书,往往也是能经得住时间推敲的.比如这本: 我相信 ...

  6. 类型“unknown”上不存在属性“foreach”_JavaScript红宝书第四版精简解析系列--映射Map数据类型...

    Map数据类型 顾名思义 也就是映射类型,包含一个[[Entries]]私有特性 我们可以使用一个二维数组作为初始值 const map1 = new Map([[1, 1],[2, 2],[3, 3 ...

  7. 【红宝书笔记精简版】第十二章 BOM

    目录 12.1 window 对象 12.1.1 Global 作用域 12.1.2 窗口关系 12.1.3 窗口位置与像素比 12.1.4 窗口大小 12.1.5 视口位置 12.1.6 导航与打开 ...

  8. 【红宝书笔记精简版】 第二十四章 网络请求与远程资源

    目录 24.1 XMLHttpRequest 对象 24.1.1 使用 XHR 24.1.2 HTTP 头部 24.1.3 GET 请求 24.1.4 POST 请求 24.1.5 XMLHttpRe ...

  9. OpenGL红宝书:第一个渲染程序Triangles常见问题归总

    OpenGL红宝书第八版从shader开始讲起,其实渲染对大多数人来说都是充满吸引力的,但是程序写起来确实比较麻烦,书上面第一示例程序零零散散也弄了好几天.这里写个博客汇总一下,我觉得对所有初学者都有 ...

最新文章

  1. Go 知识点(11) — goroutine 泄露、设置子协程退出条件
  2. C++之(pair)用法总结
  3. JAVA-重写equalse规范、技巧
  4. 每日一笑 | 在托运行李时,怎样才能不会因为超重被罚钱?
  5. Google Chrome 开发进度 官方Blog
  6. 由一段JS代码引发的思考
  7. Fiddler2教程(Web调试工具)
  8. windows pycharm如何恢复默认设置_如何备份/恢复一个基于Windows系统的操作面板?...
  9. win10 卸载mysql5.7
  10. 金字塔原理读书笔记 一 为什么使用金字塔结构
  11. 美国十大web2.0公司背后的故事
  12. 模糊c均值聚类及python实现
  13. 未检测到正确安装的网络适配器_网络适配器图标出现黄色感叹号的解决办法
  14. php网页显示左中,php的动态页面在ie内核的浏览器面整体偏左的解决方法静
  15. 写给大家看的CSS书,写给大家看的设计书
  16. post-processing effects HDR
  17. 网页字体单位px、em、%、rem、pt、vm、vh介绍
  18. 57.音乐播放器的进度条
  19. 团体程序设计天梯赛-练习集 L1-059 敲笨钟 (20分)
  20. RuntimeError: NCCL error in:torch/lib/c10d/ProcessGroupNCCL.cpp:514, invalid usage, NCCL version 踩坑

热门文章

  1. 缺陷检测相关论文继续更新
  2. Collider 一: 添加分组、节点分组、代码读取分组等
  3. 什么是MQ?什么时候使用MQ?为什么要使用MQ?
  4. 潜伏者(题解)——间谍好多啊!
  5. 西米支付:支付二维码的简单介绍
  6. 在Google Daydream上用VR观看Youtobe视频吧!
  7. 电阻式传感器测量原理与测量电路
  8. 【趋势分析方法二】MATLAB实现改进M-K趋势分析
  9. android11.0 Launcher3 高端定制之增加负一屏(仿谷歌Velvet方案)
  10. ThreeJS 地球上撒点