/// <summary> /// Sample returns a single possible direction /// </summary> /// <param name="woL"></param> /// <returns></returns> public override (Spectrum, Vector3, double) Sample_f(Vector3 wo) { var F = fresnel.Evaluate(Utils.CosTheta(wo)); bool entering = Utils.CosTheta(wo) > 0; var etaI = entering ? fresnel.EtaI : fresnel.EtaT; var etaT = entering ? fresnel.EtaT : fresnel.EtaI; var n = new Vector3(0, 0, 1); n = Vector3.Dot(n, wo) < 0 ? -n : n; var(refracted, wt) = Refract(wo, n, etaI / etaT); if (!refracted) { return(Spectrum.ZeroSpectrum, null, 0); } Spectrum ft = r * (1 - F.Max()); var pdf = 1 - F.Max(); return(ft / Utils.AbsCosTheta(wt), wt, pdf); }
/// <summary> /// Sample returns a single possible direction /// </summary> /// <param name="woL"></param> /// <returns></returns> public override (Spectrum, Vector3, double) Sample_f(Vector3 woL) { // perfect specular reflection Vector3 wiL = new Vector3(-woL.x, -woL.y, woL.z); Spectrum ft = r * fresnel.Evaluate(Utils.CosTheta(wiL)); return(ft / Utils.AbsCosTheta(wiL), wiL, 1); }