def resample_wo(sampler, active): """ Sample outgoing direction and pdf with cosine weighted sampling""" d_out_local = warp.square_to_cosine_hemisphere(sampler.next_2d(active)) d_out_pdf = warp.square_to_cosine_hemisphere_pdf(d_out_local) return d_out_local, d_out_pdf
def pdf(self, ctx, si, wo, active): if not ctx.is_enabled(BSDFFlags.DiffuseReflection): return Vector3f(0) cos_theta_i = Frame3f.cos_theta(si.wi) cos_theta_o = Frame3f.cos_theta(wo) pdf = warp.square_to_cosine_hemisphere_pdf(wo) return ek.select((cos_theta_i > 0.0) & (cos_theta_o > 0.0), pdf, 0.0)
def sample(self, ctx, si, sample1, sample2, active): cos_theta_i = Frame3f.cos_theta(si.wi) active &= cos_theta_i > 0 bs = BSDFSample3f() bs.wo = warp.square_to_cosine_hemisphere(sample2) bs.pdf = warp.square_to_cosine_hemisphere_pdf(bs.wo) bs.eta = 1.0 bs.sampled_type = +BSDFFlags.DiffuseReflection bs.sampled_component = 0 value = self.m_reflectance.eval(si, active) return (bs, ek.select(active & (bs.pdf > 0.0), value, Vector3f(0)))
def my_pdf(p): return square_to_cosine_hemisphere_pdf(p)