Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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));
            }
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
 public MicrofacetReflection(TrowbridgeReitzDistribution distribution, Fresnel fresnel, RgbColor tint)
 {
     this.distribution = distribution;
     this.fresnel      = fresnel;
     this.tint         = tint;
 }