Ejemplo n.º 1
0
        public override Vector3D SampleF(ref ShadeRec sr, ref Vector3D wo, out Vector3D wi, out double pdf)
        {
            double   NDotWo = sr.Normal.DotProduct(wo);
            Vector3D r      = -wo + 2.0 * sr.Normal.ScaleBy(NDotWo);

            Vector3D w = r;
            Vector3D u = new Vector3D(0.00424, 1, 0.00764).CrossProduct(w).Normalize().ToVector3D();

            Vector3D v = u.CrossProduct(w);

            Vector3D sp = SamplerRef.SampleHemisphere();

            wi = sp.X * u + sp.Y * v + sp.Z * w;

            if (sr.Normal.DotProduct(wi) < 0.0)
            {
                wi = -sp.X * u - sp.Y * v + sp.Z * w;
            }

            double phong_lobe = Math.Pow(r * wi, Exp);

            pdf = phong_lobe * (sr.Normal.DotProduct(wi));

            return(Cs.ScaleBy(phong_lobe).ScaleBy(Ks));
        }
Ejemplo n.º 2
0
        public override Vector3D SampleF(ref ShadeRec sr, ref Vector3D wo, out Vector3D wi, out double pdf)
        {
            Vector3D w = sr.Normal;
            Vector3D v = new Vector3D(0.0034, 1, 0.0071);

            v = v.CrossProduct(w);
            v = v.Normalize().ToVector3D();
            Vector3D u = v.CrossProduct(w);

            Vector3D sp = SamplerRef.SampleHemisphere();

            wi = sp.X * u + sp.Y * v + sp.Z * w;
            wi = wi.Normalize().ToVector3D();

            pdf = (float)(sr.Normal * wi * (1.0 / Math.PI));

            return(Cd.ScaleBy(Kd * (1.0 / Math.PI)));
        }
Ejemplo n.º 3
0
 public Vector3D GetDirection(ref ShadeRec sr)
 {
     return(SamplerRef.SampleHemisphere());
 }
Ejemplo n.º 4
0
        public override Vector3D Sample()
        {
            Vector2D SP = SamplerRef.SampleUnitSquare();

            return(p0 + a.ScaleBy(SP.X) + b.ScaleBy(SP.Y));
        }