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);
        }
示例#2
0
        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);
        }