上一篇文章,笔者提到了红宝书第8版的代码编译运行问题,想必大家已经知道我看过红宝书了。
然而,笔者竟然看不懂,这是因为笔者并不知道OpenGL的历史。原来有古代OpenGL和现代OpenGL之分,古代OpenGL使用固定功能管线,现在已经被废弃(尽管还能用),而现代使用可编程管线。
由于笔者在网上搜索一通,见到怎么OpenGL的代码有两种风格,到了现在才搞懂。原来OpenGL在第8版之前都是讲的固定功能管线,到了第8版立即转成了可编程管线。然而红宝书已经认定了你有一定的计算机图形学基础,因此介绍的内容都比较高深,不从基础讲起,导致即使有一定编程和几何基础的笔者也读不懂红宝书。
因此笔者就买了这本《交互式计算机图形学 基於OpenGL着色器的自顶向下方法(第6版) 》来看了,感觉写的非常不错,这本书第6版还新增了一个作者,这个作者正是红宝书的作者Dave。看着跟红宝书简直是完美融合,并且也详尽地解释了OpenGL里面的各个基本术语,这个在红宝书里几乎是一笔带过的。
然而,这本书的代码确实有一定问题的,即使笔者先前已经成功编译过红宝书的代码,然而编译这本书的代码还是折腾了几个小时,下面讲解一下。
先从https://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/ 下载该书的代码
笔者仅下载了一部分代码,如图所示
然后新建控制台空项目,笔者将项目命名为e1,如图所示
然后把所需源文件和着色器文件添加进来,并设置编译模式为release,如图所示
然后添加附加包含文件
然后再从https://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/ 下载库文件,并将windows文件夹名字改为lib,如图所示
添加附加库目录
编译,报错,无法打开文件“freeglut.lib”
然后把libfreeglut.a改名为freeglut.lib,如图所示
编译,扔报错,如图所示
无法解析的外部符号,既有glut的函数又有glew的函数
网上百度了一下,前面带有_imp_的都是静态库,因此笔者在example1.cpp中添加了两个宏,如图所示
编译,仍报错,无法打开文件“freeglut_static.lib”
然后笔者复制freeglut.lib,再改名为freeglut_static.lib,如图所示
编译,仍然报错,但这次仅有glew的问题
修改附加依赖项,添加libglew32.a库,如图所示
编译,成功
把着色器文件放入工程文件所在目录下
编译,发生崩溃,在glewInit()前加入glewExperimental= GL_TRUE;(跟上一篇文章一样)
运行成功。