mitsuba 开发指南(01)

mitsuba 开发指南.01

  • 参考 document 版本
1
2
3
4
Mitsuba Documentation
Version 0.5.0
Wenzel Jakob
February 25, 2014

一些个问题

  • 在写代码的时候一直在报错,找不到 Float 的定义,为了不报错,我在如下文件中加了定
    • include/mitsuba/core/platform.h
1
2
3
4
5
6
7
8
#define SINGLE_PRECISION // 这一行是我添加的, 编译的时候需要去掉
#if defined(DOUBLE_PRECISION)
typedef double Float;
#elif defined(SINGLE_PRECISION)
typedef float Float;
#else
#error No precision flag was defined!
#endif
  • 这个指定是在编译指令中指定的
    • config.py
    • 一个服务器上可行的配置
  • 更好的解决方式是在 vscode 中预定义宏

9. Code Structure

  • 分为 4 个部分
    • libcore:图片 IO、数据结构、程序调度、插件管理
    • librender:场景(光源、材质、参与介质、shapes)
    • libhw:硬件加速、显示、OpenGL、交互 GUI
    • libidir:为了实现 BDPT 准备的一些库

10. Coding Style

  • 4 空格缩进
  • 左括号同行
  • 命名格式:camel-case
    • 类名首字母大写
    • 成员函数首字母小写
    • 成员变量加上前缀:m_
1
2
3
4
5
6
7
8
class MyClass {
public:
MyClass(int value) : m_value(value) { }
inline void setValue(int value) { m_value = value; }
inline int getValue() const { return m_value; }
private:
int m_value;
};
  • 枚举变量加上前缀 E
  • 尽量能加 const 就加上 const
  • 简单函数使用 inline
  • 头文件加注释
  • 使用 Boost 库
  • 所有的 class 都会被分配在堆上,struct 可能在堆上也可能在栈上
    • 使用方式如下
    • ref<>
1
2
3
4
if (..) {
ref<MyClass> instance = new MyClass();
instance->doSomething()
} // reference expires, instance will be deallocated
  • 实现插件的时候,继承自泛化的接口

11. 实现一个用户插件(plugin)

  • 两种方式
    • sampling-based integrators
      • 基于光线追踪,发出一条光线,估计它的 incident radiance
      • 实现 SamplingIntegrator 接口即可
        • 这样我们并行层、网络层自然实现(不需要我们自己写)
      • 也可以实现其他接口
        • an irradiance cache
        • an adaptive integrator
    • generic ones
      • 不能归为上一类的,需要一些特殊的操作,例如 VPL

(1) 实现一个深度查看器的教程

文件夹

  • src/integrators/ 文件夹下新建文件夹 depthmap,接下来的操作全在 depthmap 文件夹中操作

depthViewer.cpp

  • 新建 depthViewer.cpp 文件
  • 具体内容看 cpp 代码
  • 实际调用序列化函数的时候按照如下方法
    • 我们想要的是对整个对象进行序列化,不仅简单的递归调用,可能存在如下问题
      • 某个成员被引用多次(浪费空间)
      • 互相引用(陷入无限递归)
    • 当我们需要对堆上的物体进行序列化和反序列化的时候,进行如下调用
1
2
3
4
5
6
7
// 序列化
ref<SomeClass> myObject = ...;
manager->serialize(stream, myObject.get());

// 反序列化
ref<SomeClass> myObject =
static_cast<SomeClass *>(manager->getInstance(stream));

导出插件

  • integrators 文件夹下有一个 SConscript 文件,加上如下一行
1
plugins += env.SharedLibrary('DepthViewer', ['depthViewer/depthViewer.cpp'])
  • 在根目录编译
1
2
# linux
scons -j$(nproc)
  • 生成的文件在 dist 文件夹下
  • 场景文件配置如下
    • test.xml
      • 应该得到一张全绿色的照片
1
2
3
4
5
6
7
<?xml version='1.0' encoding='utf-8'?>

<scene version="0.6.0">
<integrator type="DepthViewer">
<!-- <spectrum name="color" value="1.0"/> -->
</integrator>
</scene>
  • 渲染
1
./mitsuba -o test1 test.xml
  • 生成了一张 test.exr,转化为 test.png 查看
1
./mtsutil tonemap -f png -t test1.exr

其他场景