Ejemplo n.º 1
0
        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);
        }