Mitsuba是一款面向研究的渲染器,因其对材质的模拟非常细致,故而在研究领域应用的非常多。Mitsuba的开发团队也比较争气,已经开发到第二代了。最近由于工作上的需要,在Windows下陆续编译了2代和1代的Mitsuba源码,踩了一些坑,在这里记录一下。
注:Mitsuba相关的代码和数据都可以在他们的github账户下找到。
第二代比第一代规范太多了,因此先说怎么编译第二代。
首先打开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就相当坑爹了,年久失修不说,支持的编译器还是很久之前的,最高支持到vs2013。尝试在Windows下直接编译,碰壁无数,最终放弃,转而用Windows内置的Linux子系统(WSL) 来编译。
注意:使用WSL的一个缺点是不支持GPU加速。微软在2020年5月微软build大会宣布WSL将会添加CUDA支持,相信不久之后就可以了。但是截至目前(2020年6月底),尚未看到WSL更新的迹象。
既然是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
好了,接下来会有很多编译错误,我们一个个来解决。
错误信息:
src/bsdfs/irawan.h:314:84: error: no matching function for call to ‘bind(, const type, const _1_type&)’
解决方案:
参考issue-103,修改src/bsdfs/irawan.h
文件中的语句:
#if BOOST_VERSION >= 106000
为:
#if BOOST_VERSION >= 105800
就可以了。
错误信息:
/usr/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h:92:102: error: no match for ‘operator*=’ (operand types are ‘DScalar1 >’ and ‘const DScalar1 >’)
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;
即可。
更新:这个error已经在issue被修复了,如果不用上述的方法,也可以参考git上给出的方法修正这个问题。
错误信息:
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一样)。
Mitsuba 1 Document