1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "MicrofacetDistribution.ih"
OSPRAY_BEGIN_ISPC_NAMESPACE
// Beckmann distribution
struct BeckmannDistribution
{
float alpha;
};
inline BeckmannDistribution make_BeckmannDistribution(float alpha)
{
BeckmannDistribution m;
m.alpha = alpha;
return m;
}
inline vec3f sample(
const BeckmannDistribution &self, float &pdf, const vec2f &s)
{
float alpha2 = sqr(self.alpha);
float tanTheta2 = -alpha2 * log(1.f - s.x);
float cosTheta = rsqrt(1.f + tanTheta2);
float sinTheta = cos2sin(cosTheta);
float phi = 2.f * (float)pi * s.y;
float cosTheta3 = sqr(cosTheta) * cosTheta;
pdf = (1.f - s.x) * rcp((float)pi * alpha2 * cosTheta3);
float sinPhi, cosPhi;
sincos(phi, &sinPhi, &cosPhi);
float x = cosPhi * sinTheta;
float y = sinPhi * sinTheta;
float z = cosTheta;
return make_vec3f(x, y, z);
}
OSPRAY_END_ISPC_NAMESPACE
|