26 float sigma =
fmaxf(bsdf->sigma, 0.01f);
27 bsdf->invsigma2 = 1.0f / (sigma * sigma);
43 float cosNO =
dot(
N,
I);
44 float cosNI =
dot(
N, omega_in);
45 if (cosNO > 0 && cosNI > 0) {
48 float cosNH =
dot(
N,
H);
51 if (!(
fabsf(cosNH) < 1.0f - 1e-5f && cosHO > 1e-5f)) {
55 float cosNHdivHO = cosNH / cosHO;
56 cosNHdivHO =
fmaxf(cosNHdivHO, 1e-5f);
58 float fac1 = 2 *
fabsf(cosNHdivHO * cosNO);
59 float fac2 = 2 *
fabsf(cosNHdivHO * cosNI);
61 float sinNH2 = 1 - cosNH * cosNH;
62 float sinNH4 = sinNH2 * sinNH2;
63 float cotangent2 = (cosNH * cosNH) / sinNH2;
65 float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
68 float out = 0.25f * (
D *
G) / cosNO;
108 if (
dot(Ng, *omega_in) > 0) {
111 float cosNI =
dot(
N, *omega_in);
112 float cosNO =
dot(
N,
I);
113 float cosNH =
dot(
N,
H);
116 if (
fabsf(cosNO) > 1e-5f &&
fabsf(cosNH) < 1.0f - 1e-5f && cosHO > 1e-5f) {
117 float cosNHdivHO = cosNH / cosHO;
118 cosNHdivHO =
fmaxf(cosNHdivHO, 1e-5f);
120 float fac1 = 2 *
fabsf(cosNHdivHO * cosNO);
121 float fac2 = 2 *
fabsf(cosNHdivHO * cosNI);
123 float sinNH2 = 1 - cosNH * cosNH;
124 float sinNH4 = sinNH2 * sinNH2;
125 float cotangent2 = (cosNH * cosNH) / sinNH2;
127 float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
130 float power = 0.25f * (
D *
G) / cosNO;
134 #ifdef __RAY_DIFFERENTIALS__
136 *domega_in_dx = (2 *
dot(
N, dIdx)) *
N - dIdx;
137 *domega_in_dy = (2 *
dot(
N, dIdy)) *
N - dIdy;
ccl_device int bsdf_ashikhmin_velvet_setup(ccl_private VelvetBsdf *bsdf)
ccl_device int bsdf_ashikhmin_velvet_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
CCL_NAMESPACE_BEGIN struct VelvetBsdf VelvetBsdf
ccl_device float3 bsdf_ashikhmin_velvet_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
#define CCL_NAMESPACE_END
@ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
ccl_device_inline void sample_uniform_hemisphere(const float3 N, float randu, float randv, ccl_private float3 *omega_in, ccl_private float *pdf)
BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z)