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)); }
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))); }
public Vector3D GetDirection(ref ShadeRec sr) { return(SamplerRef.SampleHemisphere()); }
public override Vector3D Sample() { Vector2D SP = SamplerRef.SampleUnitSquare(); return(p0 + a.ScaleBy(SP.X) + b.ScaleBy(SP.Y)); }