public override Vec3 Shade(ShadeRec sr) { Vec3 L = base.Shade(sr); Vec3 wo = sr.Ray.D * -1; Vec3 wi = null; Vec3 fr = reflective.SampleF(sr, ref wi, wo); Ray reflectedRay = new Ray(sr.HitPoint, wi); if (specularBtdf.Tir(sr)) { L += sr.World.Tracer.TraceRay(reflectedRay, sr.Depth + 1); } else { Vec3 wt = null; Vec3 ft = specularBtdf.SampleF(sr, ref wt, wo); Ray transmittedRay = new Ray(sr.HitPoint, wt); L += fr * sr.World.Tracer.TraceRay(reflectedRay, sr.Depth + 1) * Math.Abs(sr.Normal.Dot(wi)); L += ft * sr.World.Tracer.TraceRay(transmittedRay, sr.Depth + 1) * Math.Abs(sr.Normal.Dot(wt)); } return(L); }
public override Vec3 Shade(ShadeRec sr) { Vec3 L = base.Shade(sr); Vec3 wo = (sr.Ray.D * -1); Vec3 wi = null; Vec3 fr = reflectiveBrdf.SampleF(sr, ref wi, wo); Ray reflectedRay = new Ray(sr.HitPoint, wi); L += fr * sr.World.Tracer.TraceRay(reflectedRay, sr.Depth + 1) * sr.Normal.Dot(wi); return(L); }