Exemple #1
0
        public static Color32 GetColor(Ray r, HitableList hitableList, Hitable importance, int depth)
        {
            var hrec = new HitRecord();

            if (hitableList.Hit(r, 0.00001f, float.MaxValue, ref hrec))
            {
                var srec    = new ScatterRecord();
                var emitted = hrec.shader.emitted(r, hrec, hrec.u, hrec.v, hrec.p);
                if (depth < Configuration.MAX_SCATTER_TIME)
                {
                    if (hrec.shader.scatter(r, ref hrec, ref srec))
                    {
                        if (srec.is_specular)
                        {
                            return(srec.attenuation *
                                   GetColor(srec.specular_ray, Scene.main.world, importance, depth + 1));
                        }
                        var p         = new MixturePdf(new HitablePdf(importance, hrec.p), srec.pdf);
                        var scattered = new Ray(hrec.p, p.Generate(), r.time);
                        var pdf       = p.Value(scattered.direction);
                        return(emitted + srec.attenuation * hrec.shader.scattering_pdf(r, hrec, scattered) *
                               GetColor(scattered, Scene.main.world, importance, depth + 1) / pdf);
                    }
                    else
                    {
                        return(depth == 0 ? emitted.Aravge() : emitted);
                    }
                }
                else
                {
                    return(depth == 0?emitted.Aravge():emitted);
                }
            }
            return(Scene.main.Skybox ? Scene.main.sky.Value(r.direction.Normalized()) : Color32.Black);

#pragma warning disable CS0162 // 检测到无法访问的代码
            var t = 0.5f * r.normal_direction.y + 1f;
#pragma warning restore CS0162 // 检测到无法访问的代码
            return(Scene.main.Skybox ? (1 - t) * new Color32(2, 2, 2) + t * new Color32(0.5f, 0.7f, 1) : Color32.Black);
        }