27 bsdf->roughness1 =
clamp(bsdf->roughness1, 0.001f, 1.0f);
28 bsdf->roughness2 =
clamp(bsdf->roughness2, 0.001f, 1.0f);
35 bsdf->roughness1 =
clamp(bsdf->roughness1, 0.001f, 1.0f);
36 bsdf->roughness2 =
clamp(bsdf->roughness2, 0.001f, 1.0f);
46 float offset = bsdf->offset;
48 float roughness1 = bsdf->roughness1;
49 float roughness2 = bsdf->roughness2;
51 float Iz =
dot(Tg,
I);
56 float omega_in_z =
dot(Tg, omega_in);
60 float cosphi_i =
dot(omega_in_y, locy);
67 float roughness1_inv = 1.0f / roughness1;
68 float roughness2_inv = 1.0f / roughness2;
69 float phi_i =
fast_acosf(cosphi_i) * roughness2_inv;
76 float theta_h = (theta_i + theta_r) * 0.5f;
79 float phi_pdf =
fast_cosf(phi_i * 0.5f) * 0.25f * roughness2_inv;
80 float theta_pdf = roughness1 /
81 (2 * (
t *
t + roughness1 * roughness1) * (a_R - b_R) * costheta_i);
82 *pdf = phi_pdf * theta_pdf;
111 float offset = bsdf->offset;
113 float roughness1 = bsdf->roughness1;
114 float roughness2 = bsdf->roughness2;
115 float Iz =
dot(Tg,
I);
120 float omega_in_z =
dot(Tg, omega_in);
133 float roughness1_inv = 1.0f / roughness1;
138 float theta_h = (theta_i + theta_r) / 2;
140 float phi =
fabsf(phi_i);
143 float theta_pdf = roughness1 /
144 (2 * (
t *
t + roughness1 * roughness1) * (a_TT - b_TT) * costheta_i);
145 float phi_pdf = roughness2 / (c_TT * (p * p + roughness2 * roughness2));
147 *pdf = phi_pdf * theta_pdf;
165 float offset = bsdf->offset;
167 float roughness1 = bsdf->roughness1;
168 float roughness2 = bsdf->roughness2;
169 float Iz =
dot(Tg,
I);
174 float roughness1_inv = 1.0f / roughness1;
178 float t = roughness1 *
tanf(randu * (a_R - b_R) + b_R);
181 float theta_i = 2 * theta_h - theta_r;
183 float costheta_i, sintheta_i;
186 float phi = 2 *
safe_asinf(1 - 2 * randv) * roughness2;
188 float phi_pdf =
fast_cosf(phi * 0.5f) * 0.25f / roughness2;
190 float theta_pdf = roughness1 /
191 (2 * (
t *
t + roughness1 * roughness1) * (a_R - b_R) * costheta_i);
193 float sinphi, cosphi;
195 *omega_in = (cosphi * costheta_i) * locy - (sinphi * costheta_i) * locx + (sintheta_i)*Tg;
198 #ifdef __RAY_DIFFERENTIALS__
199 *domega_in_dx = 2 *
dot(locy, dIdx) * locy - dIdx;
200 *domega_in_dy = 2 *
dot(locy, dIdy) * locy - dIdy;
203 *pdf =
fabsf(phi_pdf * theta_pdf);
226 float offset = bsdf->offset;
228 float roughness1 = bsdf->roughness1;
229 float roughness2 = bsdf->roughness2;
230 float Iz =
dot(Tg,
I);
235 float roughness1_inv = 1.0f / roughness1;
240 float t = roughness1 *
tanf(randu * (a_TT - b_TT) + b_TT);
243 float theta_i = 2 * theta_h - theta_r;
245 float costheta_i, sintheta_i;
248 float p = roughness2 *
tanf(c_TT * (randv - 0.5f));
250 float theta_pdf = roughness1 /
251 (2 * (
t *
t + roughness1 * roughness1) * (a_TT - b_TT) * costheta_i);
252 float phi_pdf = roughness2 / (c_TT * (p * p + roughness2 * roughness2));
254 float sinphi, cosphi;
256 *omega_in = (cosphi * costheta_i) * locy - (sinphi * costheta_i) * locx + (sintheta_i)*Tg;
259 #ifdef __RAY_DIFFERENTIALS__
260 *domega_in_dx = 2 *
dot(locy, dIdx) * locy - dIdx;
261 *domega_in_dy = 2 *
dot(locy, dIdy) * locy - dIdy;
264 *pdf =
fabsf(phi_pdf * theta_pdf);
MINLINE float safe_asinf(float a)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ccl_device int bsdf_hair_transmission_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_device float3 bsdf_hair_transmission_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_hair_reflection_setup(ccl_private HairBsdf *bsdf)
ccl_device float3 bsdf_hair_reflection_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_hair_transmission_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_hair_reflection_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_device int bsdf_hair_transmission_setup(ccl_private HairBsdf *bsdf)
ccl_device float3 bsdf_hair_reflection_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
CCL_NAMESPACE_BEGIN struct HairBsdf HairBsdf
#define kernel_assert(cond)
#define CCL_NAMESPACE_END
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
@ CLOSURE_BSDF_HAIR_TRANSMISSION_ID
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
ccl_device void fast_sincosf(float x, ccl_private float *sine, ccl_private float *cosine)
ccl_device float fast_acosf(float x)
ccl_device float fast_atan2f(float y, float x)
ccl_device float fast_cosf(float x)
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
T clamp(const T &a, const T &min, const T &max)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)