17 #ifndef __BSDF_ASHIKHMIN_SHIRLEY_H__
18 #define __BSDF_ASHIKHMIN_SHIRLEY_H__
64 float NdotI =
dot(
N,
I);
65 float NdotO =
dot(
N, omega_in);
72 if (NdotI > 0.0f && NdotO > 0.0f) {
73 NdotI =
fmaxf(NdotI, 1e-6f);
74 NdotO =
fmaxf(NdotO, 1e-6f);
81 float pump = 1.0f /
fmaxf(1e-6f, (HdotI *
fmaxf(NdotO, NdotI)));
91 float lobe =
powf(HdotN,
e);
94 out = NdotO *
norm * lobe * pump;
96 *pdf =
norm * lobe / HdotI;
103 float HdotX =
dot(
H,
X);
104 float HdotY =
dot(
H,
Y);
107 float e = (n_x * HdotX * HdotX + n_y * HdotY * HdotY) / (1.0f - HdotN * HdotN);
108 lobe =
powf(HdotN,
e);
115 out = NdotO *
norm * lobe * pump;
116 *pdf =
norm * lobe / HdotI;
132 float n_x,
float n_y,
float randu,
float randv,
float *phi,
float *cos_theta)
135 float cos_phi =
cosf(*phi);
136 float sin_phi =
sinf(*phi);
137 *cos_theta =
powf(randv, 1.0f / (n_x * cos_phi * cos_phi + n_y * sin_phi * sin_phi + 1.0f));
157 float NdotI =
dot(
N,
I);
177 cos_theta =
powf(randv, 1.0f / (n_x + 1.0f));
182 float remapped_randu = 4.0f * randu;
184 n_x, n_y, remapped_randu, randv, &phi, &cos_theta);
186 else if (randu < 0.5f) {
187 float remapped_randu = 4.0f * (.5f - randu);
189 n_x, n_y, remapped_randu, randv, &phi, &cos_theta);
192 else if (randu < 0.75f) {
193 float remapped_randu = 4.0f * (randu - 0.5f);
195 n_x, n_y, remapped_randu, randv, &phi, &cos_theta);
199 float remapped_randu = 4.0f * (1.0f - randu);
201 n_x, n_y, remapped_randu, randv, &phi, &cos_theta);
202 phi = 2.0f *
M_PI_F - phi;
207 float sin_theta =
sqrtf(
fmaxf(0.0f, 1.0f - cos_theta * cos_theta));
208 float cos_phi =
cosf(phi);
209 float sin_phi =
sinf(phi);
214 float HdotI =
dot(
H,
I);
219 *omega_in = -
I + (2.0f * HdotI) *
H;
232 #ifdef __RAY_DIFFERENTIALS__
234 *domega_in_dx = (2.0f *
dot(
N, dIdx)) *
N - dIdx;
235 *domega_in_dy = (2.0f *
dot(
N, dIdy)) *
N - dIdy;
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ccl_device void bsdf_ashikhmin_shirley_blur(ShaderClosure *sc, float roughness)
ccl_device_forceinline float3 bsdf_ashikhmin_shirley_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
CCL_NAMESPACE_BEGIN ccl_device int bsdf_ashikhmin_shirley_setup(MicrofacetBsdf *bsdf)
ccl_device_inline float bsdf_ashikhmin_shirley_roughness_to_exponent(float roughness)
ccl_device int bsdf_ashikhmin_shirley_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)
ccl_device_inline void bsdf_ashikhmin_shirley_sample_first_quadrant(float n_x, float n_y, float randu, float randv, float *phi, float *cos_theta)
ccl_device float3 bsdf_ashikhmin_shirley_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
ccl_device void make_orthonormals_tangent(const float3 N, const float3 T, float3 *a, float3 *b)
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
@ CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID
ccl_device_inline void make_orthonormals(const float3 N, float3 *a, float3 *b)
ccl_device_inline int clamp(int a, int mn, int mx)
ccl_device_inline float2 normalize(const float2 &a)
ccl_device_inline float dot(const float2 &a, const float2 &b)