使用pbrt 1.03遇到的问题和解决方法

 

版本1.03,在http://www.pbrt.org/downloads.php下载,目前是最新的,使用起来遇到了如下问题,可能以后还会更多。

1.
编译flexbison脚本。这一步的确很烦,很多人都是卡在这一步就过不去了。这里详细解释一下。readme和很多教程上讲在windows下编译pbrt第一步要装cygwin。实际上只用到了flexbison两个程序,这两个程序原本是linux下的程序,cygwin将他们移植到windows平台。这两个程序是生成处理pbrt脚本的代码。pbrt规定了自己的场景描述规则(虽然很像rendermanrib文件,但有的地方还是不同)。程序为了能够解析这个场景描述文件,如果我们一般人写这部分程序,估计就if...else...一大堆逐行判断了,这样写起来扩展性差,代码难懂,编写和调式起来都很麻烦。
作者使用了高级的工具,即flex词法分析和bison(或者叫yacc)语法分析。如果是计算机专业学习过《编译原理》并做过实验的话,我想应该知道这是什么东西。如果没学过,我想也没有必要搞清原理。总体来说就是就是写两个脚本文件pbrtlex.lpbrtparse.y(见vs项目工程下core->Parse File),这两个文件是flexbison自己的描述语言写成,它用来描述场景描述规则的。flexbison通过这两个描述文件,直接生成
pbrtlex.cpppbrtparse.cpppbrtparse.hpp这三个文件,他们就可以直接集成到系统中读取和分析pbrt场景描述文件了。所以如果没有装cygwin或者没有编译成功这三个文件,后面会报错说这三个文件找不到。对于大多数应用来说,没有必要修改场景描述规则,所以直接把这三个文件拿过来放到工程里用就行,编译好了一个/Files/gaoyuear/parsed_files.rar,可以直接下载用。这样用的话就不用flexbison编译了,右键单机pbrtlex.lpbrtparse.y,选择属性,Configuration选择All Configurations,右面Excluded from build选择Yes就可以了。
如果自己编译的话,生成出来的pbrtlex.cpp文件中还有一个错误,第764行将#include <unistd.h>注释掉,第1907行替换为b->yy_is_interactive = 0;就可以了。附件中的文件已经改过了。

 

安装步骤:

步骤一:下载/Files/gaoyuear/parsed_files.rar

步骤二:copy上面三个文件到pbrt-1.03/core

步骤三:进入VS2005(在pbrt-1.03/win32/Projects内任意点一个project文件),选core里面的Parser Files, pbrtlex.lpbrtparse.y这两个文件,分别在其文件名上右键,选excluded from build
步骤四:如果您用的是双核以上CPUtools->options->projects and solutions->build and run中,maximum number of parallel project builds改成1。并且把zlib1d.dllzlib1.dll这两个dll拷贝到你的release目录。

步骤五:编译,如果没有问题,会在pbrt-1.03/win32/Projects中多出release目录。

步骤六:设定环境变量:我的电脑->属性->高级->环境变量:新增加环境变量项:PBRT_SEARCHPATH,其内容是…/pbrt-1.03/win32/Projects/Release,再修改系统参数的path,后面加上目录…pbrt-1.03/win32/Projects/Release

Done!

下面的内容没有翻译,因为需要Examples.zip文件,我自己没有,但是还是把它贴上,也许对有用的人能用到:

再来就可以测试一些sample scene. 举个例子, pbrt scene的目录下打
pbrt balls.pbrt
pbrt render完后, 就会产生exr文件. 使用C:/pbrt-src-1.03/pbrt-1.03/win32/openexr-1.4.0-vs2005/bin中的exrdisplay去观看即可。


2. windows
下只能使用vs2005编译。一开始,用vs2008编译出来后,一运行就报错。后来网上找到作者说vs2008有问题,得重新编译一些第三方库文件,并且还有可能导致速度慢很多。所以一定不能用vs2008来编译pbrt

3. LookAt bug

pbrt
使用的是左手座标系,对于熟悉opengl的人来说很痛苦,并且LookAt函数还有个bug,使我为了搞清它的座标系统花费了很长时间。
默认的左手世界座标系是(假定面对显示器),向前为+z,向右是+x,向上是+y。相机默认位于原点,面向+z
左手座标系里的向量叉乘(Cross)满足左手法则。
Rotate
的角度满足左手法则,和书上P72. Figure2.10的图不符(书上是右手法则)。
LookAt
函数的bug P76页, transform.cpp 109行,应该是

Vector dir = Normalize(look - pos);
Vector right = Normalize(Cross(up, dir));
Vector newUp = Cross(dir, right);

原文把后两个叉乘的向量写反了。

 

 

安装好了PBRT之后,我一直在找如何使用它,但是没结果,问过赵老师之后,知道了是自己写脚本,格式为pbrt格式,赵老师给了一些网上的例子:

http://www.cse.ohio-state.edu/~parent/classes/782/labs/PBRT/pbrtscene.html

http://www.mpi-inf.mpg.de/~tongbo/pbrt/index.html

http://groups.google.com/group/pbrt/browse_thread/thread/892ccb44fcda5128

有这样的老师真是好!呵呵

 

 

注:部分内容属于转载,但本文是经过自己整理得到的适合自己的.

发布了30 篇原创文章 · 获赞 2 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章