public override Vec3 PathShade(ShadeRec sr) { Vec3 L = new Vec3(); Vec3 wo = sr.Ray.D * -1; Vec3 wiDiff = null; Vec3 wiSpec = null; float pdfDiff = 0.0f; float pdfSpec = 0.0f; Vec3 Ldiff = diffuse.SampleF(sr, ref wiDiff, wo, ref pdfDiff); Vec3 Lspec = specular.SampleF(sr, ref wiSpec, wo, ref pdfSpec); double ndotwiDiff = sr.Normal.Dot(wiDiff); double ndotwiSpec = sr.Normal.Dot(wiSpec); Ray diffRay = new Ray(sr.HitPoint, wiDiff); Ray specRay = new Ray(sr.HitPoint, wiSpec); Ldiff *= sr.World.Tracer.TraceRay(diffRay, sr.Depth + 1) * ndotwiDiff / pdfDiff; Lspec *= sr.World.Tracer.TraceRay(specRay, sr.Depth + 1) * ndotwiSpec / pdfSpec; L += Ldiff + Lspec; return(L); }
public override Vec3 Shade(ShadeRec sr) { Vec3 L = base.Shade(sr); Vec3 wo = sr.Ray.D * -1; Vec3 wi = null; float pdf = 0; Vec3 fr = glossySpecular.SampleF(sr, ref wi, wo, ref pdf); Ray reflectedRay = new Ray(sr.HitPoint, wi); L += fr * sr.World.Tracer.TraceRay(reflectedRay, sr.Depth + 1) * sr.Normal.Dot(wi) / pdf; return(L); }