Windows下編譯Mitsuba 1&2

簡介

Mitsuba是一款面向研究的渲染器,因其對材質的模擬非常細緻,故而在研究領域應用的非常多。Mitsuba的開發團隊也比較爭氣,已經開發到第二代了。最近由於工作上的需要,在Windows下陸續編譯了2代和1代的Mitsuba源碼,踩了一些坑,在這裏記錄一下。
注:Mitsuba相關的代碼和數據都可以在他們的github賬戶下找到。

Mitsuba 2

第二代比第一代規範太多了,因此先說怎麼編譯第二代。

準備工作

  1. python 3 (>=3.6)
  2. cmake
  3. 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 2 Document

Mitsuba 1

相較於第二代,Mitsuba 1就相當坑爹了,年久失修不說,支持的編譯器還是很久之前的,最高支持到vs2013。嘗試在Windows下直接編譯,碰壁無數,最終放棄,轉而用Windows內置的Linux子系統(WSL) 來編譯。
注意:使用WSL的一個缺點是不支持GPU加速。微軟在2020年5月微軟build大會宣佈WSL將會添加CUDA支持,相信不久之後就可以了。但是截至目前(2020年6月底),尚未看到WSL更新的跡象。

準備工作

  1. 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-devlibpcrecpp0v5這兩個包,官方文檔給出的名稱分別是libpng12-devlibpcrecpp0,其實這兩個包在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&)’

編譯錯誤1
解決方案:
參考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; }

編譯錯誤2
解決方案:
我的做法是直接找到出錯的文件 /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’

編譯錯誤3
解決方案:
參考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一樣)。

參考文檔

Mitsuba 1 Document

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章