33 #ifndef __BSDF_ASHIKHMIN_VELVET_H__
34 #define __BSDF_ASHIKHMIN_VELVET_H__
74 float cosNO =
dot(
N,
I);
75 float cosNI =
dot(
N, omega_in);
76 if (cosNO > 0 && cosNI > 0) {
79 float cosNH =
dot(
N,
H);
82 if (!(
fabsf(cosNH) < 1.0f - 1e-5f && cosHO > 1e-5f))
85 float cosNHdivHO = cosNH / cosHO;
86 cosNHdivHO =
fmaxf(cosNHdivHO, 1e-5f);
88 float fac1 = 2 *
fabsf(cosNHdivHO * cosNO);
89 float fac2 = 2 *
fabsf(cosNHdivHO * cosNI);
91 float sinNH2 = 1 - cosNH * cosNH;
92 float sinNH4 = sinNH2 * sinNH2;
93 float cotangent2 = (cosNH * cosNH) / sinNH2;
95 float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
96 float G =
min(1.0f,
min(fac1, fac2));
98 float out = 0.25f * (
D *
G) / cosNO;
136 if (
dot(Ng, *omega_in) > 0) {
139 float cosNI =
dot(
N, *omega_in);
140 float cosNO =
dot(
N,
I);
141 float cosNH =
dot(
N,
H);
144 if (
fabsf(cosNO) > 1e-5f &&
fabsf(cosNH) < 1.0f - 1e-5f && cosHO > 1e-5f) {
145 float cosNHdivHO = cosNH / cosHO;
146 cosNHdivHO =
fmaxf(cosNHdivHO, 1e-5f);
148 float fac1 = 2 *
fabsf(cosNHdivHO * cosNO);
149 float fac2 = 2 *
fabsf(cosNHdivHO * cosNI);
151 float sinNH2 = 1 - cosNH * cosNH;
152 float sinNH4 = sinNH2 * sinNH2;
153 float cotangent2 = (cosNH * cosNH) / sinNH2;
155 float D =
expf(-cotangent2 * m_invsigma2) * m_invsigma2 *
M_1_PI_F / sinNH4;
156 float G =
min(1.0f,
min(fac1, fac2));
158 float power = 0.25f * (
D *
G) / cosNO;
162 #ifdef __RAY_DIFFERENTIALS__
164 *domega_in_dx = (2 *
dot(
N, dIdx)) *
N - dIdx;
165 *domega_in_dy = (2 *
dot(
N, dIdy)) *
N - dIdy;
ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_ashikhmin_velvet_setup(VelvetBsdf *bsdf)
CCL_NAMESPACE_BEGIN typedef ccl_addr_space struct VelvetBsdf VelvetBsdf
ccl_device bool bsdf_ashikhmin_velvet_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device float3 bsdf_ashikhmin_velvet_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_ashikhmin_velvet_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
ccl_device_inline void sample_uniform_hemisphere(const float3 N, float randu, float randv, float3 *omega_in, float *pdf)
@ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID
ccl_device_inline float2 normalize(const float2 &a)
ccl_device_inline float dot(const float2 &a, const float2 &b)
ccl_device_inline bool isequal_float3(const float3 a, const float3 b)
BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z)