def make_context(n): mi = MediumInteraction3f.zero(n) mi.wi = wi ek.set_slices(mi.wi, n) mi.sh_frame = Frame3f(-mi.wi) mi.wavelengths = [] ctx = PhaseFunctionContext(None) return mi, ctx
def test03_smith_g1_beckmann(variant_packet_rgb): from mitsuba.core import Vector3f from mitsuba.render import MicrofacetDistribution, MicrofacetType # Compare against data obtained from previous Mitsuba v0.6 implementation mdf = MicrofacetDistribution(MicrofacetType.Beckmann, 0.1, 0.3, False) mdf_i = MicrofacetDistribution(MicrofacetType.Beckmann, 0.1, False) steps = 20 theta = ek.linspace(Float, ek.pi / 3, ek.pi / 2, steps) phi = Float.full(ek.pi / 2, steps) cos_theta, sin_theta = ek.cos(theta), ek.sin(theta) cos_phi, sin_phi = ek.cos(phi), ek.sin(phi) v = [cos_phi * sin_theta, sin_phi * sin_theta, cos_theta] wi = Vector3f(0, 0, 1) ek.set_slices(wi, steps) assert np.allclose(mdf.smith_g1(v, wi), [ 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000523e+00, 9.9941480e-01, 9.9757767e-01, 9.9420297e-01, 9.8884594e-01, 9.8091525e-01, 9.6961778e-01, 9.5387781e-01, 9.3222123e-01, 9.0260512e-01, 8.6216795e-01, 8.0686140e-01, 7.3091686e-01, 6.2609726e-01, 4.8074335e-01, 2.7883825e-01, 1.9197471e-06 ]) assert ek.allclose(mdf_i.smith_g1(v, wi), [ 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 9.9828446e-01, 9.8627287e-01, 9.5088160e-01, 8.5989666e-01, 6.2535185e-01, 5.7592310e-06 ]) steps = 20 theta = Float.full(ek.pi / 2 * 0.98, steps) phi = ek.linspace(Float, 0, 2 * ek.pi, steps) cos_theta, sin_theta = ek.cos(theta), ek.sin(theta) cos_phi, sin_phi = ek.cos(phi), ek.sin(phi) v = [cos_phi * sin_theta, sin_phi * sin_theta, cos_theta] assert ek.allclose(mdf.smith_g1(v, wi), [ 0.67333597, 0.56164336, 0.42798978, 0.35298213, 0.31838724, 0.31201753, 0.33166203, 0.38421196, 0.48717275, 0.63746351, 0.63746351, 0.48717275, 0.38421196, 0.33166203, 0.31201753, 0.31838724, 0.35298213, 0.42798978, 0.56164336, 0.67333597 ]) assert ek.allclose(mdf_i.smith_g1(v, wi), Float.full(0.67333597, steps))
def make_context(n): si = SurfaceInteraction3f.zero(n) si.wi = wi ek.set_slices(si.wi, n) si.wavelengths = [] return (si, ctx)
def test02_eval_pdf_beckmann(variant_packet_rgb): from mitsuba.core import Vector3f from mitsuba.render import MicrofacetDistribution, MicrofacetType # Compare against data obtained from previous Mitsuba v0.6 implementation mdf = MicrofacetDistribution(MicrofacetType.Beckmann, 0.1, 0.3, False) mdf_i = MicrofacetDistribution(MicrofacetType.Beckmann, 0.1, False) assert not mdf.is_isotropic() assert mdf.is_anisotropic() assert mdf_i.is_isotropic() assert not mdf_i.is_anisotropic() steps = 20 theta = ek.linspace(Float, 0, ek.pi, steps) phi = Float.full(ek.pi / 2, steps) cos_theta, sin_theta = ek.cos(theta), ek.sin(theta) cos_phi, sin_phi = ek.cos(phi), ek.sin(phi) v = [cos_phi * sin_theta, sin_phi * sin_theta, cos_theta] wi = Vector3f(0, 0, 1) ek.set_slices(wi, steps) assert ek.allclose(mdf.eval(v), [ 1.06103287e+01, 8.22650051e+00, 3.57923722e+00, 6.84863329e-01, 3.26460004e-02, 1.01964230e-04, 5.87322635e-10, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00 ]) assert ek.allclose(mdf.pdf(wi, v), [ 1.06103287e+01, 8.11430168e+00, 3.38530421e+00, 6.02319300e-01, 2.57622823e-02, 6.90584930e-05, 3.21235011e-10, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00 ]) assert ek.allclose(mdf_i.eval(v), [ 3.18309879e+01, 2.07673073e+00, 3.02855828e-04, 1.01591990e-11, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00 ]) assert ek.allclose(mdf_i.pdf(wi, v), [ 3.18309879e+01, 2.04840684e+00, 2.86446273e-04, 8.93474877e-12, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00, -0.00000000e+00 ]) theta = Float.full(0.1, steps) phi = ek.linspace(Float, 0, 2 * ek.pi, steps) cos_theta, sin_theta = ek.cos(theta), ek.sin(theta) cos_phi, sin_phi = ek.cos(phi), ek.sin(phi) v = [cos_phi * sin_theta, sin_phi * sin_theta, cos_theta] assert ek.allclose(mdf.eval(v), [ 3.95569706, 4.34706259, 5.54415846, 7.4061389, 9.17129803, 9.62056446, 8.37803268, 6.42071199, 4.84459257, 4.05276537, 4.05276537, 4.84459257, 6.42071199, 8.37803268, 9.62056446, 9.17129803, 7.4061389, 5.54415846, 4.34706259, 3.95569706 ]) assert ek.allclose( mdf.pdf(wi, v), Float([ 3.95569706, 4.34706259, 5.54415846, 7.4061389, 9.17129803, 9.62056446, 8.37803268, 6.42071199, 4.84459257, 4.05276537, 4.05276537, 4.84459257, 6.42071199, 8.37803268, 9.62056446, 9.17129803, 7.4061389, 5.54415846, 4.34706259, 3.95569706 ]) * ek.cos(0.1)) assert ek.allclose(mdf_i.eval(v), Float.full(11.86709118, steps)) assert ek.allclose(mdf_i.pdf(wi, v), Float.full(11.86709118 * ek.cos(0.1), steps))
def test04_sample_beckmann(variant_packet_rgb): from mitsuba.core import Vector3f from mitsuba.render import MicrofacetDistribution, MicrofacetType mdf = MicrofacetDistribution(MicrofacetType.Beckmann, 0.1, 0.3, False) # Compare against data obtained from previous Mitsuba v0.6 implementation steps = 6 u = ek.linspace(Float, 0, 1, steps) u1, u2 = ek.meshgrid(u, u) u = [u1, u2] wi = Vector3f(0, 0, 1) ek.set_slices(wi, steps * steps) result = mdf.sample(wi, u) ref = (np.array([[0.00000000e+00, 0.00000000e+00, 1.00000000e+00], [4.71862517e-02, 1.23754589e-08, 9.98886108e-01], [7.12896436e-02, 1.86970155e-08, 9.97455657e-01], [9.52876359e-02, 2.49909284e-08, 9.95449781e-01], [1.25854731e-01, 3.30077086e-08, 9.92048681e-01], [1.00000000e+00, 2.62268316e-07, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00], [1.44650340e-02, 1.33556545e-01, 9.90935624e-01], [2.16356069e-02, 1.99762881e-01, 9.79605377e-01], [2.85233315e-02, 2.63357669e-01, 9.64276493e-01], [3.68374363e-02, 3.40122312e-01, 9.39659417e-01], [1.07676744e-01, 9.94185984e-01, 0.00000000e+00], [-0.00000000e+00, 0.00000000e+00, 1.00000000e+00], [-3.80569659e-02, 8.29499215e-02, 9.95826781e-01], [-5.72742373e-02, 1.24836378e-01, 9.90522861e-01], [-7.61397704e-02, 1.65956154e-01, 9.83189344e-01], [-9.96606201e-02, 2.17222810e-01, 9.71021116e-01], [-4.17001039e-01, 9.08905983e-01, 0.00000000e+00], [-0.00000000e+00, -0.00000000e+00, 1.00000000e+00], [-3.80568914e-02, -8.29499587e-02, 9.95826781e-01], [-5.72741292e-02, -1.24836430e-01, 9.90522861e-01], [-7.61396214e-02, -1.65956244e-01, 9.83189344e-01], [-9.96605307e-02, -2.17223123e-01, 9.71021056e-01], [-4.17000234e-01, -9.08906400e-01, 0.00000000e+00], [0.00000000e+00, -0.00000000e+00, 1.00000000e+00], [1.44650899e-02, -1.33556545e-01, 9.90935624e-01], [2.16356907e-02, -1.99762881e-01, 9.79605377e-01], [2.85234209e-02, -2.63357460e-01, 9.64276552e-01], [3.68375629e-02, -3.40122133e-01, 9.39659476e-01], [1.07677162e-01, -9.94185925e-01, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00], [4.71862517e-02, 8.25030622e-09, 9.98886108e-01], [7.12896436e-02, 1.24646773e-08, 9.97455657e-01], [9.52876359e-02, 1.66606196e-08, 9.95449781e-01], [1.25854731e-01, 2.20051408e-08, 9.92048681e-01], [1.00000000e+00, 1.74845553e-07, 0.00000000e+00]]), np.array([ 10.61032867, 8.51669121, 6.41503906, 4.302598, 2.17350101, 0., 10.61032867, 8.72333431, 6.77215099, 4.7335186, 2.55768704, 0., 10.61032867, 8.59542656, 6.55068302, 4.46557426, 2.31778312, 0., 10.61032867, 8.59542656, 6.55068302, 4.46557426, 2.31778359, 0., 10.61032867, 8.72333431, 6.77215099, 4.73351765, 2.55768657, 0., 10.61032867, 8.51669121, 6.41503906, 4.302598, 2.17350101, 0. ])) assert ek.allclose(ref[0], result[0], atol=5e-4) assert ek.allclose(ref[1], result[1], atol=1e-4)