簡介
Mitsuba是一款面向研究的渲染器,因其對材質的模擬非常細緻,故而在研究領域應用的非常多。Mitsuba的開發團隊也比較爭氣,已經開發到第二代了。最近由於工作上的需要,在Windows下陸續編譯了2代和1代的Mitsuba源碼,踩了一些坑,在這裏記錄一下。
注:Mitsuba相關的代碼和數據都可以在他們的github賬戶下找到。
Mitsuba 2
第二代比第一代規範太多了,因此先說怎麼編譯第二代。
準備工作
- python 3 (>=3.6)
- cmake
- Visual Studio 2019
編譯過程
獲取源碼
首先打開cmd(或powershell),從Mitsuba 2的github倉庫上將其拉到本地:
git clone --recursive https://github.com/mitsuba-renderer/mitsuba2.git
注意由於Mitsuba2還有一些子模塊,所以要使用--recursive
參數全部拉下來,不然編譯會不過。如果已經clone下來了忘記加--recursive
,可以運行命令:
git submodule update --init --recursive
更新子模塊。
編譯
然後定位到mitsuba 2的路徑,執行
cmake -G "Visual Studio 16 2019" -A x64
等cmake執行完畢,會出現VS的項目文件(mitsuba.sln
),用VS打開,生成 - 生成解決方案,然後在dist
目錄下就可以找到mitsuba.exe
。
設置路徑
此時已經可以運行mitsuba.exe
來渲染場景了。如果希望能用cmd直接調用Mitsuba,可以雙擊運行setpath.bat
,或者手動將mitsuba.exe
所在的路徑添加到環境變量PATH
裏面。
使用
使用Mitsuba渲染的時候,在cmd輸入:
mitsuba scene.xml
其中scene.xml
是Mitsuba定義的場景格式,在其repo的resources\data\scenes
路徑下有幾個簡單場景可以用來測試。更多參數和命令可以參考Mitsuba官方文檔。
參考文檔
Mitsuba 1
相較於第二代,Mitsuba 1就相當坑爹了,年久失修不說,支持的編譯器還是很久之前的,最高支持到vs2013。嘗試在Windows下直接編譯,碰壁無數,最終放棄,轉而用Windows內置的Linux子系統(WSL) 來編譯。
注意:使用WSL的一個缺點是不支持GPU加速。微軟在2020年5月微軟build大會宣佈WSL將會添加CUDA支持,相信不久之後就可以了。但是截至目前(2020年6月底),尚未看到WSL更新的跡象。
準備工作
- WSL。在Microsoft Store可以下載。注意一定要Ubuntu 18的版本,而不要用最新的Ubuntu 20。因爲Ubuntu 20缺少一些Mitsuba 1的依賴包。如果不想採坑建議直接下Ubuntu 18。
編譯過程
安裝依賴
既然是Linux子系統,那就要按Linux的一套規則來辦事,先用apt-get安裝依賴:
sudo apt-get install build-essential scons mercurial \
qt4-dev-tools libpng-dev libjpeg-dev \
libilmbase-dev libxerces-c-dev libboost-all-dev \
libopenexr-dev libglewmx-dev libxxf86vm-dev \
libpcrecpp0v5 libeigen3-dev libfftw3-dev
這些都是官方給出的依賴項。其中mercurial是Mitsuba 1使用的代碼管理工具,比較神奇竟然不是git。
還有個坑是libpng-dev
和libpcrecpp0v5
這兩個包,官方文檔給出的名稱分別是libpng12-dev
和libpcrecpp0
,其實這兩個包在Ubuntu 18已經更名了,改過來就好,問題不大。
還有一點,官方文檔說還需要安裝一個collada,但是因爲找不到libpcrecpp0
的緣故,沒有安裝成功。貌似這個東西不影響後續過程,所以就沒管。
獲取源碼
然後找個乾淨的地方把代碼拉下來
hg clone https://www.mitsuba-renderer.org/hg/mitsuba
編譯
進入Mitsuba 1的根目錄,先提取config文件:
cp build/config-linux-gcc.py config.py
這個config文件在Linux下沒啥大問題,基本上不用改。
仍然在根目錄,執行編譯:
scons
好了,接下來會有很多編譯錯誤,我們一個個來解決。
編譯錯誤1
錯誤信息:
src/bsdfs/irawan.h:314:84: error: no matching function for call to ‘bind(<unresolved overloaded function type>, const type, const _1_type&)’
解決方案:
參考issue-103,修改src/bsdfs/irawan.h
文件中的語句:
#if BOOST_VERSION >= 106000
爲:
#if BOOST_VERSION >= 105800
就可以了。
編譯錯誤2
錯誤信息:
/usr/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h:92:102: error: no match for ‘operator*=’ (operand types are ‘DScalar1<float, Eigen::Matrix<float, 1, 7> >’ and ‘const DScalar1<float, Eigen::Matrix<float, 1, 7> >’)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; }
解決方案:
我的做法是直接找到出錯的文件 /usr/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h
,把其中的
a *= b;
改爲:
a = a * b;
即可。
編譯錯誤3
錯誤信息:
src/shapes/ply.cpp:512:7: error: ‘at’ is not a member of ‘ply’
解決方案:
參考issue-7,簡單來說是一個C++ standard更新帶來的錯誤,解決方案是在src\shapes\ply\ply_parser.hpp
文件的開頭添加這樣一句:
#define ADT_WORKAROUND 1
然後就可以編譯通過了。
如果還遇到一些其他的奇奇怪怪的錯誤,可以先來github issue裏面找一找是不是別人已經踩過坑了。
設置路徑
順利編譯成功之後,設置路徑:
source setpath.sh
最後就能在WSL裏面直接運行mitsuba scene.xml
了(用法跟Mitsuba 2一樣)。