public void ComputeScatteringFunctions(SurfaceInteraction si, IObjectArena arena, TransportMode mode, bool allowMultipleLobes) { BumpMap?.Bump(si); var bsdf = si.BSDF.Initialize(in si); var kd = Kd.Evaluate(in si).Clamp(); if (!kd.IsBlack()) { bsdf.Add(arena.Create <LambertianReflection>().Initialize(in kd)); } var ks = Ks.Evaluate(in si).Clamp(); if (ks.IsBlack()) { return; } var fresnel = arena.Create <FresnelDielectric>().Initialize(1.5f, 1f); var rough = Roughness.Evaluate(in si); if (RemapRoughness) { rough = TrowbridgeReitzDistribution.RoughnessToAlpha(rough); } var distribution = arena.Create <TrowbridgeReitzDistribution>().Initialize(rough, rough); bsdf.Add(arena.Create <MicrofacetReflection>().Initialize(ks, distribution, fresnel)); }
public void ComputeScatteringFunctions(SurfaceInteraction si, IObjectArena arena, TransportMode mode, bool allowMultipleLobes) { _bumpMap?.Bump(si); si.BSDF.Initialize(si); var uRough = _uRoughness?.Evaluate(si) ?? _roughness.Evaluate(si); var vRough = _vRoughness?.Evaluate(si) ?? _roughness.Evaluate(si); if (_remapRoughness) { uRough = TrowbridgeReitzDistribution.RoughnessToAlpha(uRough); vRough = TrowbridgeReitzDistribution.RoughnessToAlpha(vRough); } var fr = arena.Create <FresnelConductor>().Initialize(Spectrum.One, _eta.Evaluate(si), _k.Evaluate(si)); var dist = arena.Create <TrowbridgeReitzDistribution>().Initialize(uRough, vRough); si.BSDF.Add(arena.Create <MicrofacetReflection>().Initialize(Spectrum.One, dist, fr)); }