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); }