PBRT 学习:安装编译

文章转自:http://wutiam.net/notes/116
版权归原作者。
虽然,该文章对应的windows系统,但是对了解pbrt的编译非常有帮助。原文如下。

去年在前公司看着 leader 用 PBRT 做基于 DX11/SM5.0 的 ray tracing 实验时,还懵懂得云里雾里。而我现在的 manager,在读研的时候就已经在研究 PBRT 了。我, out 了!最近由于工作的原因,终于开始着手学习 PBRT,而这玩意第一道关卡就是安装编译中的一堆问题,记录以备不时只需。

网上关于 PBRT 的资料基本都是 1.03 或更早的,而且基本都跳过了自动生成代码的预处理阶段。这次下载来的最新 pbrt-src-1.04.zip for Windows 虽然在其 release note 里说“a number of bugs and incompatabilities have been fixed”,但从我安装编译的经过来看,问题似乎更多了(斯坦福的大大们不应该这么粗心吧)。

首先把下载的文件解压到任意目录下,我这是“D:\Program Files\pbrt-1.04”,不过推荐还是放到分区根目录或者文件夹名不含空格的路径下,否则后面会多几个体力活。

PBRT 使用了 Bison 和 Flex 这两个工具来生成用于解析 pbrt 脚本文件的代码文件(这话有点绕哈),而这两个工具本是 Linux 下的,现在都有大大做了 Windows 版的移植(Bison for Windows,Flex for Windows)。分别把 Bison Binaries 中的 \bin 和 \share、Bison Dependencies 中的 \bin、Flex Binaries 中的 \bin 目录解压到任意目录下,我这是“D:\GnuWin32”。

这时 PBRT 还是不能编译的,原因是 1.04 中移除了对 OpenEXR 工具包的包含。OpenEXR 本身是三大 HDRI 格式之一,另外两种格式在以前我都处理过,而对 EXR 格式不熟,这里暂时也不做深究。OpenEXR 工具包可以在其官网下载(最新的 1.5.0 没有 VS2005 的预编译版本,我偷懒就直接下 openexr-1.4.0-vs2005.zip 了),也可以从 PBRT 1.03 zip 包中直接拿来用,然后整个解压出来,我这是“D:\Program Files\pbrt-1.04\openexr-1.4.0-vs2005”。这还没完,无论是官网还是 PBRT 1.03 里的 OpenEXR 工具包,在 \lib 文件夹下都缺少 zdll.lib 这个文件,去 zlib 首页下载 zlib compiled DLL zipfile,把压缩包中的 \lib 解压到 OpenEXR 所在文件夹下。

接下来就可以用 VS2005 打开 PBRT 文件夹下的 \win32\pbrt.sln,这时先别急着按 F7,工程属性里还有不少设置需要修改。

先展开 core 工程下的 Parser Files 文件夹,分别打开 pbrtlex.l 和 pbrtparse.y 两个文件的属性对话框,编辑 Custom Build Step | General | Command Line,重新指定 flex 和 bison 程序的位置及参数,我这是:

“D:\GnuWin32\bin1\flex.exe” -o” (InputDir)/ (InputName).cpp” “$(InputPath)”

“D:\GnuWin32\bin\bison.exe” -d -v -t -o” (InputDir)/ (InputName).cpp” “$(InputPath)”

注意这里所有的路径都被引号包裹了,这是由于我把 PBRT 放在“Program Files”这个文件夹下,如前面所述,本来这些引号可以不需要加的,后面的设置项也有同样问题,不一一注明了。检测这个步骤是否修改正确,可以直接编译这两个奇怪的文件,如果能在 \core 文件夹下生成 pbrtlex.cpp、pbrtparse.cpp 和 pbrtparse.hpp 这三个文件,则 OK 了,否则会有关于“error: A tool returned an error code from “Lexing pbrtlex””或“error: A tool returned an error code from “Yacc’ing pbrtparse””的报错。

过了上面这一步,其实离成功距离就不远了。按照官网 FAQ 里的说法,在 \core 文件夹下创建一个空的 unistd.h 文件,而不是注释掉 \core\pbrtlex.cpp 里的“#include ”这行,否则每次编译 pbrtlex.cpp 后还得再改一次,麻烦。还有一个很“粗心”的错,在 core 工程属性里的 Linker | Input | Additional Dependencies,居然漏写了“IlmThread.lib”这个库,加上就好。如果不嫌累,还可以把 Debug 模式下的几个库(Half.lib、Iex.lib、IlmImf.lib、IlmThread.lib、Imath.lib)改为 Half_d.lib、Iex_d.lib、IlmImf_d.lib、IlmThread_d.lib、Imath_d.lib。

如果 build 到最后,在 render 这个工程的 Post-Build Event 中报类似“Copying zlib1.dll to ……”失败的错误,则应该是由于路径包含空格导致其工程属性里 Build Events | Post-Build Event | Command Line 的展开路径没法正确访问引起的错误,加上引号就好了。

Well done! 最后,在系统环境变量里,加一项“PBRT_SEARCHPATH”,值为“D:\Program Files\pbrt-1.04\win32\Projects\Release”,否则 pbrt 程序是跑不起来的。现在,下载一个测试用的 pbrt 脚本文件,再写个批处理脚本 pbrt.cmd,都放到 PBRT 文件夹下的 \scenes 文件夹下,来测试下 pbrt 程序吧,批处理脚本如下:

SET PATH=%PATH%;%PBRT_SEARCHPATH%

pbrt.exe sharp.pbrt
“..\openexr-1.4.0-vs2005\bin\exrdisplay.exe” sharp.exr

P.S. 据说 PBRT 无法在 VS2008+ 下正常工作,未经测试。

你可能感兴趣的:(ray,trace,computer,graphics,PBRT,tool,use,others)