[toc]

# 体渲染的简单定义

假设在只需要模拟,不考虑微观物理的前提下

1、光线射入到体当中,行进的距离与密度成反比。 2、光线射入到体当中,发生碰撞的光的下一个方向是任意的,不像碰到金属物体发生任意方向的反射(其实不是任意的,它不可能指向金属内部),而光线在体中传递碰撞的方向是任意的。 在 RayTracing 中,可以将这种描述统一成一种材质

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class isotropic : public material {
public:
isotropic(color c) : albedo(make_shared<solid_color>(c)) {}
isotropic(shared_ptr<texture> a) : albedo(a) {}

virtual bool scatter(
const ray& r_in, const hit_record& rec, color& attenuation, ray& scattered
) const override {
scattered = ray(rec.p, random_in_unit_sphere(), r_in.time());
attenuation = albedo->value(rec.u, rec.v, rec.p);
return true;
}

public:
shared_ptr<texture> albedo;
};

# 体积 hit fucntion

由上述性质可以知道,可以设定一个随机数,使射线与体积的碰撞可以有距离限制
另外一点,由于射线碰撞距离与密度成反比,所以求得随机距离后,使用 1/密度 * 随机距离 既可以得到简单的入射深度。