public int CompareTo(RgbSpectrum other) { return this.y().CompareTo(other.y()); }
public override void Sample_f(ref Vector wo, ref Normal Normal, ref Normal shadeNormal, ref RgbSpectrum in_f, float u0, float u1, float u2, ref SurfaceTextureData surfaceData, out BsdfSampleData result) { result.Lambda = 0f; EvalParams(ref surfaceData); Assert.IsTrue(!Krefl.IsBlack()); Assert.IsTrue(!Krefrct.IsBlack()); Vector rayDir = -wo; var N = shadeNormal; var shadeN = shadeNormal; var wi = new Vector(); var N1 = N.ToVec(); var reflDir = rayDir - (2f * (Normal.Dot(ref N, ref rayDir))) * N1; // Ray from outside going in ? bool into = ((Normal.Dot(ref N, ref shadeN)) > 0); float nc = ousideIor; bool disperse = in_f.y() > u0; float nt = ior + (disperse ? (1f - in_f.y())/10f : 0f); if (disperse) { Krefrct = in_f.MaxAsSingle()*in_f; //SampledSpectrum.ReflRainbow[(int) Math.Round((SampledSpectrum.ReflRainbow.Length-1)*u2)]; } float nnt = into ? (nc / nt) : (nt / nc); float ddn = (rayDir & shadeN.ToVec()); float cos2t = 1f - nnt * nnt * (1f - ddn * ddn); result.F = RgbSpectrum.UnitSpectrum(); // Total internal reflection if (cos2t < 0f) { wi = reflDir; result.Pdf = 1f; result.Type = reflectionSpecularBounce ? BrdfType.Specular : BrdfType.Glossy; result.F = Krefl; result.Wi = wi; return; } float kk = (into ? 1f : -1f) * (ddn * nnt + MathLab.Sqrt((cos2t))); Vector nkk = kk * N1; Vector transDir = (nnt * rayDir - nkk).Normalize(); float c = 1f - (into ? -ddn : (transDir & N1)); float Re = R0 + (1f - R0) * c * c * c * c * c; float Tr = 1f - Re; float P = .25f + .5f * Re; if (Tr.NearEqual(0f)) { if (Re.NearEqual(0f)) { result.Pdf = 0f; result.Type = BrdfType.Specular; result.F = new RgbSpectrum(0f); } else { (wi) = reflDir; result.Pdf = 1f; result.Type = reflectionSpecularBounce ? BrdfType.Specular : BrdfType.Glossy; result.F = Krefl; } } else if (Re.NearEqual(0f)) { (wi) = transDir; result.Pdf = 1f; result.Type = transmitionSpecularBounce ? BrdfType.Specular : BrdfType.Glossy; result.F = Krefrct; } else if (u0 < P) { (wi) = reflDir; result.Pdf = P / Re; result.Type = reflectionSpecularBounce ? BrdfType.Specular : BrdfType.Glossy; result.F = Krefl; } else { if (u0 > u1) { //(wi) = SampleTransmissionDirection(u0, u1, ref transDir); wi = transDir; result.F = Krefrct; //SampleTransmission(u1, u2, ref Krefrct); } else { wi = transDir; result.F = Krefrct; } result.Pdf = (1f - P) / Tr; result.Type = transmitionSpecularBounce ? BrdfType.Specular : BrdfType.Glossy; } result.Wi = wi; }
public void Add_B(ref RgbSpectrum rr) { if (ImportanceReady) return; lock (b_lock) { if (rr.y() <= 0f) return; bSamples++; var r = rr / rr.y(); B[0] += r.c1; B[1] += r.c2; B[2] += r.c3; Brightness += rr.y(); } }
public static float Importance(ref RgbSpectrum contribution) { return contribution.y(); //return contribution.Max(); }