33 #ifndef __BSDF_HAIR_H__
34 #define __BSDF_HAIR_H__
80 float offset = bsdf->
offset;
85 float Iz =
dot(Tg,
I);
90 float omega_in_z =
dot(Tg, omega_in);
94 float cosphi_i =
dot(omega_in_y, locy);
101 float roughness1_inv = 1.0f / roughness1;
102 float roughness2_inv = 1.0f / roughness2;
103 float phi_i =
fast_acosf(cosphi_i) * roughness2_inv;
110 float theta_h = (theta_i + theta_r) * 0.5f;
111 float t = theta_h - offset;
113 float phi_pdf =
fast_cosf(phi_i * 0.5f) * 0.25f * roughness2_inv;
114 float theta_pdf = roughness1 /
115 (2 * (
t *
t + roughness1 * roughness1) * (a_R - b_R) * costheta_i);
116 *pdf = phi_pdf * theta_pdf;
143 float offset = bsdf->
offset;
147 float Iz =
dot(Tg,
I);
152 float omega_in_z =
dot(Tg, omega_in);
165 float roughness1_inv = 1.0f / roughness1;
170 float theta_h = (theta_i + theta_r) / 2;
171 float t = theta_h - offset;
172 float phi =
fabsf(phi_i);
175 float theta_pdf = roughness1 /
176 (2 * (
t *
t + roughness1 * roughness1) * (a_TT - b_TT) * costheta_i);
177 float phi_pdf = roughness2 / (c_TT * (p * p + roughness2 * roughness2));
179 *pdf = phi_pdf * theta_pdf;
197 float offset = bsdf->
offset;
201 float Iz =
dot(Tg,
I);
206 float roughness1_inv = 1.0f / roughness1;
210 float t = roughness1 *
tanf(randu * (a_R - b_R) + b_R);
212 float theta_h =
t + offset;
213 float theta_i = 2 * theta_h - theta_r;
215 float costheta_i, sintheta_i;
218 float phi = 2 *
safe_asinf(1 - 2 * randv) * roughness2;
220 float phi_pdf =
fast_cosf(phi * 0.5f) * 0.25f / roughness2;
222 float theta_pdf = roughness1 /
223 (2 * (
t *
t + roughness1 * roughness1) * (a_R - b_R) * costheta_i);
225 float sinphi, cosphi;
227 *omega_in = (cosphi * costheta_i) * locy - (sinphi * costheta_i) * locx + (sintheta_i)*Tg;
230 #ifdef __RAY_DIFFERENTIALS__
231 *domega_in_dx = 2 *
dot(locy, dIdx) * locy - dIdx;
232 *domega_in_dy = 2 *
dot(locy, dIdy) * locy - dIdy;
235 *pdf =
fabsf(phi_pdf * theta_pdf);
258 float offset = bsdf->
offset;
262 float Iz =
dot(Tg,
I);
267 float roughness1_inv = 1.0f / roughness1;
272 float t = roughness1 *
tanf(randu * (a_TT - b_TT) + b_TT);
274 float theta_h =
t + offset;
275 float theta_i = 2 * theta_h - theta_r;
277 float costheta_i, sintheta_i;
280 float p = roughness2 *
tanf(c_TT * (randv - 0.5f));
282 float theta_pdf = roughness1 /
283 (2 * (
t *
t + roughness1 * roughness1) * (a_TT - b_TT) * costheta_i);
284 float phi_pdf = roughness2 / (c_TT * (p * p + roughness2 * roughness2));
286 float sinphi, cosphi;
288 *omega_in = (cosphi * costheta_i) * locy - (sinphi * costheta_i) * locx + (sintheta_i)*Tg;
291 #ifdef __RAY_DIFFERENTIALS__
292 *domega_in_dx = 2 *
dot(locy, dIdx) * locy - dIdx;
293 *domega_in_dy = 2 *
dot(locy, dIdy) * locy - dIdy;
296 *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 bool bsdf_hair_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device int bsdf_hair_reflection_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 float3 bsdf_hair_reflection_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_hair_transmission_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
CCL_NAMESPACE_BEGIN typedef ccl_addr_space struct HairBsdf HairBsdf
ccl_device float3 bsdf_hair_transmission_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_hair_reflection_setup(HairBsdf *bsdf)
ccl_device float3 bsdf_hair_reflection_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_hair_transmission_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 int bsdf_hair_transmission_setup(HairBsdf *bsdf)
#define kernel_assert(cond)
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
@ CLOSURE_BSDF_HAIR_TRANSMISSION_ID
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
__forceinline avxf cross(const avxf &a, const avxf &b)
ccl_device_inline int clamp(int a, int mn, int mx)
ccl_device void fast_sincosf(float x, float *sine, 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)
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)