[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/密度 * 随机距离
既可以得到简单的入射深度。