使用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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章