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;

即可。
更新:这个error已经在issue被修复了,如果不用上述的方法,也可以参考git上给出的方法修正这个问题。

编译错误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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页