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 SampleCornerCases_ShouldBeFinite() { float ax = 0.5f; float ay = 0.3f; var dist = new TrowbridgeReitzDistribution() { AlphaX = ax, AlphaY = ay }; var dir1 = dist.Sample(Vector3.UnitZ, new(0, 1)); var dir2 = dist.Sample(new(MathF.Sqrt(2), 0, MathF.Sqrt(2)), new(1, 0)); var dir3 = dist.Sample(Vector3.UnitZ, new(1, 0)); Assert.True(float.IsFinite(dir1.X)); Assert.True(float.IsFinite(dir1.Y)); Assert.True(float.IsFinite(dir1.Z)); Assert.True(float.IsFinite(dir2.X)); Assert.True(float.IsFinite(dir2.Y)); Assert.True(float.IsFinite(dir2.Z)); Assert.True(float.IsFinite(dir3.X)); Assert.True(float.IsFinite(dir3.Y)); Assert.True(float.IsFinite(dir3.Z)); }
public MicrofacetTransmission(RgbColor transmittance, TrowbridgeReitzDistribution distribution, float outsideIOR, float insideIOR) { this.transmittance = transmittance; this.distribution = distribution; this.outsideIOR = outsideIOR; this.insideIOR = insideIOR; Debug.Assert(outsideIOR != insideIOR); }
public void NDF_Orthogonal() { float ax = 0.5f; float ay = 0.3f; var dist = new TrowbridgeReitzDistribution() { AlphaX = ax, AlphaY = ay }; var ndf = dist.NormalDistribution(new System.Numerics.Vector3(0, 0, 1)); float expectedNdf = 1 / (MathF.PI * ax * ay); Assert.Equal(expectedNdf, ndf, 4); }
public void NDF_GrazingAngle() { float ax = 0.5f; float ay = 0.3f; var dist = new TrowbridgeReitzDistribution() { AlphaX = ax, AlphaY = ay }; var ndf = dist.NormalDistribution(new System.Numerics.Vector3(1, 0, 0)); float expectedNdf = 0; Assert.Equal(expectedNdf, ndf, 4); }
public void ComputeScatteringFunctions(SurfaceInteraction inter, bool allowMultipleLobes) { inter.Bsdf = new BSDF(inter); if (!diffuse.IsBlack()) { inter.Bsdf.Add(new LambertianReflection(diffuse)); } if (!specular.IsBlack()) { var fresnel = new FresnelDielectric(1.5f, 1.0f); var distribution = new TrowbridgeReitzDistribution(roughness); inter.Bsdf.Add(new MicrofacetReflection(specular, 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)); }
public MicrofacetReflection(TrowbridgeReitzDistribution distribution, Fresnel fresnel, RgbColor tint) { this.distribution = distribution; this.fresnel = fresnel; this.tint = tint; }