CATEGORY / Development

PBRT 学习:安装编译

Permanent Link: http://wutiam.net/notes/116

去年在前公司看着 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 WindowsFlex 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+ 下正常工作,未经测试。

18 Comments / Trackbacks / Pingbacks

  • Dec 18, 2009 @ 16:57 Reply / Quote / #1

    请问楼主“error: A tool returned an error code from "Yacc'ing pbrtparse怎么解决啊?

  • Dec 19, 2009 @ 10:52 Reply / Quote / #2

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

  • jorsion

    Dec 19, 2009 @ 21:23 Reply / Quote / #3

    @ islet8
    我是那么做的,但是还是有错误

  • jorsion

    Dec 19, 2009 @ 21:37 Reply / Quote / #4

    未能删除文件“e:\C++\PBRT\pbrt-1.04\win32\Projects\Debug\vc80.pdb”。
    请确保该文件未被其他进程打开并且未被写保护。

    请问这是什么原因啊?

  • Dec 19, 2009 @ 21:45 Reply / Quote / #5

    关掉VS,手动去删工程里的*.pdb文件,然后重新rebuild试试

  • slashspirit

    Dec 19, 2009 @ 23:40 Reply / Quote / #6

    我在VS2008下成功编译了release版 debug版本的core工程编译中出现了很多Link error 大体集中在IlmImf_d和IlmIThread_d等lib文件中。
    这些lib文件的引用路径是没有问题的 并且在项目属性中也正确添加了。请问楼主和其他学习者出现过这种情况么?谢谢。

  • slashspirit

    Dec 19, 2009 @ 23:54 Reply / Quote / #7

    一点更新 我将出错的_d.lib都改成了对应.lib文件的release版 IlmImf.lib, IlmThread.lib Iex.lib 于是 都成功编译了
    P.S. 不过我编译的是pbrt1.03 可能有若干不同 anyway 问题已经解决了~ 还是谢谢楼主的这篇文章 在之前的过程中帮了不少忙。祝楼主学习pbrt愉快:-) 有时间再交流 我这里还有MIT Opencourse里关于PBRT的一个Slides合集 如果有兴趣可以发邮件联系我 slash@shenfy.info 再次感谢

  • Dec 20, 2009 @ 00:05 Reply / Quote / #8

    斯坦福大学的 CS348B 这门课就是 PBRT 作者在教的,里面的作业及讲解也挺不错,可以看看,https://graphics.stanford.edu/wikis/cs348b-09

  • slashspirit

    Dec 20, 2009 @ 00:42 Reply / Quote / #9

    @ islet8
    谢谢 我刚才试着render一个scene file 会在WriteRGBAFile这个地方出异常... 楼主有碰到这种情况么?今天太晚了,明天再说。晚安!

  • Dec 21, 2009 @ 10:37 Reply / Quote / #10

    忘了,可能没碰到过

  • xiaoxiao9633

    Jan 12, 2010 @ 14:05 Reply / Quote / #11

    你好,我在编译core的时候总是出现
    fatal error C1083: Cannot open include file: 'ImfInputFile.h': No such file or directory e:\pbrt\core\exrio.cpp 29

    请问是怎么回事。。。
    这个是openexr中的包含文件。我按你说的做的,在生成 pbrtlex.cpp、pbrtparse.cpp 和 pbrtparse.hpp 这三个文件后就进行不下去了。。。
    xiaoxiao9633@163.com

  • Jan 13, 2010 @ 09:21 Reply / Quote / #12

    @ xiaoxiao9633
    你把OpenEXR库的Include路径加到PBRT工程选项里了么?

  • xiaoxiao9633

    Jan 25, 2010 @ 15:22 Reply / Quote / #13

    你好。
    我用1.03的编译成功了。。。

    在用1.04编译时,在编译pbrtparse.y,虽然显示生成成功,但是却不能生成那两个文件;而pbrtlex.l却正常,不知道怎么回事。。。(编译1.03版时我是用的cygwin的,可以正常生成)。是BISON的问题吗?BISON的那个SHARE文件夹是做什么用的?

  • tuming

    Feb 12, 2010 @ 14:43 Reply / Quote / #14

    恩,我的也是,lex是好的,可是bison的那两个parse文件生成不了

  • tuming

    Feb 12, 2010 @ 15:11 Reply / Quote / #15

    发现,应该是bison的问题

  • 请问斯坦福的那几个作业你做了吗?

    Feb 26, 2010 @ 10:25 Reply / Quote / #16

    @ islet8

    请问斯坦福的那几个作业你做了吗?
    可以给我参考一下吗,我的邮箱mrq1987@163.com
    谢谢了 !

  • May 17, 2010 @ 19:10 Reply / Quote / #17

    I’ve got the same problem as you,

  • May 18, 2010 @ 16:36 Reply / Quote / #18

    Great post.The best advice I can give to anyone,lucy

Leave a Reply

:) :wink: 8-O :lol: :-D 8) :-| :mrgreen: :oops: :-o :-? :( :twisted: :cry: more »