23static_assert(
sizeof(ShaderClosure) >=
sizeof(
VelvetBsdf),
"VelvetBsdf is too large!");
27 const float sigma =
fmaxf(bsdf->sigma, 0.01f);
28 bsdf->invsigma2 = 1.0f / (sigma * sigma);
41 const float m_invsigma2 = bsdf->
invsigma2;
44 const float cosNI =
dot(
N, wi);
45 const float cosNO =
dot(
N, wo);
46 if (!(cosNI > 0 && cosNO > 0)) {
53 const float cosNH =
dot(
N,
H);
56 if (!(
fabsf(cosNH) < 1.0f - 1e-5f && cosHI > 1e-5f)) {
60 float cosNHdivHI = cosNH / cosHI;
61 cosNHdivHI =
fmaxf(cosNHdivHI, 1e-5f);
63 const float fac1 = 2 *
fabsf(cosNHdivHI * cosNI);
64 const float fac2 = 2 *
fabsf(cosNHdivHI * cosNO);
66 const float sinNH2 = 1 - cosNH * cosNH;
67 const float sinNH4 = sinNH2 * sinNH2;
68 const float cotangent2 = (cosNH * cosNH) / sinNH2;
70 const float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
73 const float out = 0.25f * (
D *
G) / cosNI;
88 const float m_invsigma2 = bsdf->
invsigma2;
95 if (!(
dot(Ng, *wo) > 0)) {
103 const float cosNI =
dot(
N, wi);
104 const float cosNO =
dot(
N, *wo);
106 const float cosNH =
dot(
N,
H);
108 if (!(cosNI > 1e-5f &&
fabsf(cosNH) < 1.0f - 1e-5f && cosHI > 1e-5f)) {
114 float cosNHdivHI = cosNH / cosHI;
115 cosNHdivHI =
fmaxf(cosNHdivHI, 1e-5f);
117 const float fac1 = 2 *
fabsf(cosNHdivHI * cosNI);
118 const float fac2 = 2 *
fabsf(cosNHdivHI * cosNO);
120 const float sinNH2 = 1 - cosNH * cosNH;
121 const float sinNH4 = sinNH2 * sinNH2;
122 const float cotangent2 = (cosNH * cosNH) / sinNH2;
124 const float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
127 const float power = 0.25f * (
D *
G) / cosNI;
ccl_device int bsdf_ashikhmin_velvet_setup(ccl_private VelvetBsdf *bsdf)
ccl_device Spectrum bsdf_ashikhmin_velvet_eval(const ccl_private ShaderClosure *sc, const float3 wi, const float3 wo, ccl_private float *pdf)
ccl_device int bsdf_ashikhmin_velvet_sample(const ccl_private ShaderClosure *sc, const float3 Ng, const float3 wi, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define CCL_NAMESPACE_END
VecBase< float, D > normalize(VecOp< float, D >) RET
@ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID
ccl_device_inline float2 power(const float2 v, const float e)
ccl_device_inline void sample_uniform_hemisphere(const float3 N, const float2 rand, ccl_private float3 *wo, ccl_private float *pdf)