版本1.03,在http://www.pbrt.org/downloads.php下載,目前是最新的,使用起來遇到了如下問題,可能以後還會更多。
1. 編譯flex,bison腳本。這一步的確很煩,很多人都是卡在這一步就過不去了。這裏詳細解釋一下。readme和很多教程上講在windows下編譯pbrt第一步要裝cygwin。實際上只用到了flex和bison兩個程序,這兩個程序原本是linux下的程序,cygwin將他們移植到windows平臺。這兩個程序是生成處理pbrt腳本的代碼。pbrt規定了自己的場景描述規則(雖然很像renderman的rib文件,但有的地方還是不同)。程序爲了能夠解析這個場景描述文件,如果我們一般人寫這部分程序,估計就if...else...一大堆逐行判斷了,這樣寫起來擴展性差,代碼難懂,編寫和調式起來都很麻煩。
作者使用了高級的工具,即flex詞法分析和bison(或者叫yacc)語法分析。如果是計算機專業學習過《編譯原理》並做過實驗的話,我想應該知道這是什麼東西。如果沒學過,我想也沒有必要搞清原理。總體來說就是就是寫兩個腳本文件pbrtlex.l和pbrtparse.y(見vs項目工程下core->Parse File),這兩個文件是flex和bison自己的描述語言寫成,它用來描述“場景描述規則”的。flex和bison通過這兩個描述文件,直接生成pbrtlex.cpp,pbrtparse.cpp,pbrtparse.hpp這三個文件,他們就可以直接集成到系統中讀取和分析pbrt場景描述文件了。所以如果沒有裝cygwin或者沒有編譯成功這三個文件,後面會報錯說這三個文件找不到。對於大多數應用來說,沒有必要修改場景描述規則,所以直接把這三個文件拿過來放到工程裏用就行,編譯好了一個/Files/gaoyuear/parsed_files.rar,可以直接下載用。這樣用的話就不用flex和bison編譯了,右鍵單機pbrtlex.l和pbrtparse.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.l跟pbrtparse.y這兩個文件,分別在其文件名上右鍵,選excluded from build
步驟四:如果您用的是雙核以上CPU,tools->options->projects and solutions->build and run中,maximum number of parallel project builds改成1。並且把zlib1d.dll,zlib1.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
有這樣的老師真是好!呵呵
注:部分內容屬於轉載,但本文是經過自己整理得到的適合自己的.