38 const float cos_theta_i,
39 const float sin_theta_i,
47 if (cos_theta_i >= 0.99999f) {
49 const float phi =
M_2PI_F * randv;
50 *slope_x =
r *
cosf(phi);
51 *slope_y =
r *
sinf(phi);
57 const float tan_theta_i = sin_theta_i / cos_theta_i;
58 const float inv_a = tan_theta_i;
59 const float cot_theta_i = 1.0f / tan_theta_i;
60 const float erf_a =
fast_erff(cot_theta_i);
61 const float exp_a2 =
expf(-cot_theta_i * cot_theta_i);
62 const float SQRT_PI_INV = 0.56418958354f;
63 const float Lambda = 0.5f * (erf_a - 1.0f) + (0.5f * SQRT_PI_INV) * (exp_a2 * inv_a);
64 const float G1 = 1.0f / (1.0f + Lambda);
68 #if defined(__KERNEL_GPU__)
84 float K = tan_theta_i * SQRT_PI_INV;
85 float y_approx = randu * (1.0f + erf_a +
K * (1 - erf_a * erf_a));
86 float y_exact = randu * (1.0f + erf_a +
K * exp_a2);
87 float b =
K > 0 ? (0.5f -
sqrtf(
K * (
K - y_approx + 1.0f) + 0.25f)) /
K : y_approx - 1.0f;
91 float value = 1.0f +
b +
K *
expf(-inv_erf * inv_erf) - y_exact;
95 if (
fabsf(value) > 1e-6f) {
96 b -= value / (1.0f - inv_erf * tan_theta_i);
98 value = 1.0f +
b +
K *
expf(-inv_erf * inv_erf) - y_exact;
99 b -= value / (1.0f - inv_erf * tan_theta_i);
110 int beckmann_table_offset =
kernel_data.tables.beckmann_offset;
125 const float sin_theta_i,
133 if (cos_theta_i >= 0.99999f) {
134 const float r =
sqrtf(randu / (1.0f - randu));
135 const float phi =
M_2PI_F * randv;
136 *slope_x =
r *
cosf(phi);
137 *slope_y =
r *
sinf(phi);
144 const float tan_theta_i = sin_theta_i / cos_theta_i;
145 const float G1_inv = 0.5f * (1.0f +
safe_sqrtf(1.0f + tan_theta_i * tan_theta_i));
147 *G1i = 1.0f / G1_inv;
150 const float A = 2.0f * randu * G1_inv - 1.0f;
151 const float AA =
A *
A;
152 const float tmp = 1.0f / (AA - 1.0f);
153 const float B = tan_theta_i;
154 const float BB =
B *
B;
156 const float slope_x_1 =
B * tmp -
D;
157 const float slope_x_2 =
B * tmp +
D;
158 *slope_x = (
A < 0.0f || slope_x_2 * tan_theta_i > 1.0f) ? slope_x_1 : slope_x_2;
165 randv = 2.0f * (randv - 0.5f);
169 randv = 2.0f * (0.5f - randv);
172 const float z = (randv * (randv * (randv * 0.27385f - 0.73369f) + 0.46341f)) /
173 (randv * (randv * (randv * 0.093073f + 0.309420f) - 1.000000f) + 0.597999f);
174 *slope_y = S *
z *
safe_sqrtf(1.0f + (*slope_x) * (*slope_x));
191 float costheta_ = 1.0f;
192 float sintheta_ = 0.0f;
193 float cosphi_ = 1.0f;
194 float sinphi_ = 0.0f;
196 if (omega_i_.
z < 0.99999f) {
197 costheta_ = omega_i_.
z;
198 sintheta_ =
safe_sqrtf(1.0f - costheta_ * costheta_);
200 float invlen = 1.0f / sintheta_;
201 cosphi_ = omega_i_.
x * invlen;
202 sinphi_ = omega_i_.
y * invlen;
206 float slope_x, slope_y;
210 kg, costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i);
217 float tmp = cosphi_ * slope_x - sinphi_ * slope_y;
218 slope_y = sinphi_ * slope_x + cosphi_ * slope_y;
222 slope_x = alpha_x * slope_x;
223 slope_y = alpha_y * slope_y;
256 float alpha2 = alpha * alpha;
257 float t = 1.0f + (alpha2 - 1.0f) * NdotH * NdotH;
258 return (alpha2 - 1.0f) / (
M_PI_F *
logf(alpha2) *
t);
268 sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0);
271 bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat;
274 bsdf->sample_weight *=
average(bsdf->extra->fresnel_color);
294 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
295 bsdf->alpha_y =
saturatef(bsdf->alpha_y);
305 bsdf->alpha_y = bsdf->alpha_x;
313 bsdf->extra->cspec0 =
saturate(bsdf->extra->cspec0);
315 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
316 bsdf->alpha_y =
saturatef(bsdf->alpha_y);
328 bsdf->extra->cspec0 =
saturate(bsdf->extra->cspec0);
330 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
331 bsdf->alpha_y = bsdf->alpha_x;
344 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
345 bsdf->alpha_y = bsdf->alpha_x;
367 float alpha_y = bsdf->alpha_y;
371 if (m_refractive || alpha_x * alpha_y <= 1e-7f) {
376 float cosNO =
dot(
N,
I);
377 float cosNI =
dot(
N, omega_in);
379 if (cosNI > 0 && cosNO > 0) {
382 float alpha2 = alpha_x * alpha_y;
385 if (alpha_x == alpha_y) {
389 float cosThetaM =
dot(
N, m);
390 float cosThetaM2 = cosThetaM * cosThetaM;
391 float cosThetaM4 = cosThetaM2 * cosThetaM2;
392 float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
396 D =
D_GTR1(cosThetaM, bsdf->alpha_x);
403 D = alpha2 / (
M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
407 G1o = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
408 G1i = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
417 float slope_x = -local_m.
x / (local_m.
z * alpha_x);
418 float slope_y = -local_m.
y / (local_m.
z * alpha_y);
419 float slope_len = 1 + slope_x * slope_x + slope_y * slope_y;
421 float cosThetaM = local_m.
z;
422 float cosThetaM2 = cosThetaM * cosThetaM;
423 float cosThetaM4 = cosThetaM2 * cosThetaM2;
425 D = 1 / ((slope_len * slope_len) *
M_PI_F * alpha2 * cosThetaM4);
428 float tanThetaO2 = (1 - cosNO * cosNO) / (cosNO * cosNO);
429 float cosPhiO =
dot(
I,
X);
430 float sinPhiO =
dot(
I,
Y);
432 float alphaO2 = (cosPhiO * cosPhiO) * (alpha_x * alpha_x) +
433 (sinPhiO * sinPhiO) * (alpha_y * alpha_y);
434 alphaO2 /= cosPhiO * cosPhiO + sinPhiO * sinPhiO;
436 G1o = 2 / (1 +
safe_sqrtf(1 + alphaO2 * tanThetaO2));
438 float tanThetaI2 = (1 - cosNI * cosNI) / (cosNI * cosNI);
439 float cosPhiI =
dot(omega_in,
X);
440 float sinPhiI =
dot(omega_in,
Y);
442 float alphaI2 = (cosPhiI * cosPhiI) * (alpha_x * alpha_x) +
443 (sinPhiI * sinPhiI) * (alpha_y * alpha_y);
444 alphaI2 /= cosPhiI * cosPhiI + sinPhiI * sinPhiI;
446 G1i = 2 / (1 +
safe_sqrtf(1 + alphaI2 * tanThetaI2));
452 float common =
D * 0.25f / cosNO;
456 F *= 0.25f * bsdf->extra->clearcoat;
482 float alpha_y = bsdf->alpha_y;
483 float m_eta = bsdf->ior;
487 if (!m_refractive || alpha_x * alpha_y <= 1e-7f) {
492 float cosNO =
dot(
N,
I);
493 float cosNI =
dot(
N, omega_in);
495 if (cosNO <= 0 || cosNI >= 0) {
500 float3 ht = -(m_eta * omega_in +
I);
502 float cosHO =
dot(Ht,
I);
503 float cosHI =
dot(Ht, omega_in);
508 float alpha2 = alpha_x * alpha_y;
509 float cosThetaM =
dot(
N, Ht);
510 float cosThetaM2 = cosThetaM * cosThetaM;
511 float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
512 float cosThetaM4 = cosThetaM2 * cosThetaM2;
513 D = alpha2 / (
M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
516 G1o = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
517 G1i = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
522 float Ht2 =
dot(ht, ht);
529 float common =
D * (m_eta * m_eta) / (cosNO * Ht2);
530 float out =
G *
fabsf(cosHI * cosHO) * common;
531 *pdf = G1o *
fabsf(cosHO * cosHI) * common;
552 float alpha_y = bsdf->alpha_y;
557 float cosNO =
dot(
N,
I);
561 if (alpha_x == alpha_y)
573 kg, local_I, alpha_x, alpha_y, randu, randv,
false, &G1o);
575 float3 m =
X * local_m.
x +
Y * local_m.
y +
Z * local_m.
z;
576 float cosThetaM = local_m.
z;
580 float cosMO =
dot(m,
I);
585 *omega_in = 2 * cosMO * m -
I;
587 if (
dot(Ng, *omega_in) > 0) {
588 if (alpha_x * alpha_y <= 1e-7f) {
606 float alpha2 = alpha_x * alpha_y;
609 if (alpha_x == alpha_y) {
611 float cosThetaM2 = cosThetaM * cosThetaM;
612 float cosThetaM4 = cosThetaM2 * cosThetaM2;
613 float tanThetaM2 = 1 / (cosThetaM2)-1;
616 float cosNI =
dot(
N, *omega_in);
620 D =
D_GTR1(cosThetaM, bsdf->alpha_x);
626 G1o = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
630 D = alpha2 / (
M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
634 G1i = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
639 float slope_x = -local_m.
x / (local_m.
z * alpha_x);
640 float slope_y = -local_m.
y / (local_m.
z * alpha_y);
641 float slope_len = 1 + slope_x * slope_x + slope_y * slope_y;
643 float cosThetaM = local_m.
z;
644 float cosThetaM2 = cosThetaM * cosThetaM;
645 float cosThetaM4 = cosThetaM2 * cosThetaM2;
647 D = 1 / ((slope_len * slope_len) *
M_PI_F * alpha2 * cosThetaM4);
650 float cosNI =
dot(
N, *omega_in);
652 float tanThetaI2 = (1 - cosNI * cosNI) / (cosNI * cosNI);
653 float cosPhiI =
dot(*omega_in,
X);
654 float sinPhiI =
dot(*omega_in,
Y);
656 float alphaI2 = (cosPhiI * cosPhiI) * (alpha_x * alpha_x) +
657 (sinPhiI * sinPhiI) * (alpha_y * alpha_y);
658 alphaI2 /= cosPhiI * cosPhiI + sinPhiI * sinPhiI;
660 G1i = 2 / (1 +
safe_sqrtf(1 + alphaI2 * tanThetaI2));
664 float common = (G1o *
D) * 0.25f / cosNO;
669 *eval = G1i * common *
F;
673 *eval *= 0.25f * bsdf->extra->clearcoat;
676 #ifdef __RAY_DIFFERENTIALS__
677 *domega_in_dx = (2 *
dot(m, dIdx)) * m - dIdx;
678 *domega_in_dy = (2 *
dot(m, dIdy)) * m - dIdy;
693 #ifdef __RAY_DIFFERENTIALS__
694 float3 dRdx, dRdy, dTdx, dTdy;
696 float m_eta = bsdf->ior, fresnel;
714 if (!inside && fresnel != 1.0f) {
717 #ifdef __RAY_DIFFERENTIALS__
718 *domega_in_dx = dTdx;
719 *domega_in_dy = dTdy;
722 if (alpha_x * alpha_y <= 1e-7f ||
fabsf(m_eta - 1.0f) < 1e-4f) {
730 float alpha2 = alpha_x * alpha_y;
731 float cosThetaM2 = cosThetaM * cosThetaM;
732 float cosThetaM4 = cosThetaM2 * cosThetaM2;
733 float tanThetaM2 = 1 / (cosThetaM2)-1;
734 float D = alpha2 / (
M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
737 float cosNI =
dot(
N, *omega_in);
740 float G1i = 2 / (1 +
safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
743 float cosHI =
dot(m, *omega_in);
744 float cosHO =
dot(m,
I);
745 float Ht2 = m_eta * cosHI + cosHO;
749 float common = (G1o *
D) * (m_eta * m_eta) / (cosNO * Ht2);
750 float out = G1i *
fabsf(cosHI * cosHO) * common;
751 *pdf = cosHO *
fabsf(cosHI) * common;
775 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
776 bsdf->alpha_y =
saturatef(bsdf->alpha_y);
785 bsdf->alpha_y = bsdf->alpha_x;
792 bsdf->alpha_x =
saturatef(bsdf->alpha_x);
793 bsdf->alpha_y = bsdf->alpha_x;
810 float invA = alpha *
safe_sqrtf((1.0f - cos_n) / cos_n);
815 float a = 1.0f / invA;
816 return ((2.181f *
a + 3.535f) *
a) / ((2.577f *
a + 2.276f) *
a + 1.0f);
820 float alpha_x,
float alpha_y,
float cos_n,
float cos_phi,
float sin_phi)
828 float alphaO2 = (cos_phi * alpha_x + sin_phi * alpha_y) / (cos_phi + sin_phi);
829 float invA =
safe_sqrtf(alphaO2 * (1 - cos_n) / cos_n);
834 float a = 1.0f / invA;
835 return ((2.181f *
a + 3.535f) *
a) / ((2.577f *
a + 2.276f) *
a + 1.0f);
845 float alpha_y = bsdf->alpha_y;
849 if (m_refractive || alpha_x * alpha_y <= 1e-7f) {
854 float cosNO =
dot(
N,
I);
855 float cosNI =
dot(
N, omega_in);
857 if (cosNO > 0 && cosNI > 0) {
861 float alpha2 = alpha_x * alpha_y;
864 if (alpha_x == alpha_y) {
868 float cosThetaM =
dot(
N, m);
869 float cosThetaM2 = cosThetaM * cosThetaM;
870 float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
871 float cosThetaM4 = cosThetaM2 * cosThetaM2;
872 D =
expf(-tanThetaM2 / alpha2) / (
M_PI_F * alpha2 * cosThetaM4);
885 float slope_x = -local_m.
x / (local_m.
z * alpha_x);
886 float slope_y = -local_m.
y / (local_m.
z * alpha_y);
888 float cosThetaM = local_m.
z;
889 float cosThetaM2 = cosThetaM * cosThetaM;
890 float cosThetaM4 = cosThetaM2 * cosThetaM2;
892 D =
expf(-slope_x * slope_x - slope_y * slope_y) / (
M_PI_F * alpha2 * cosThetaM4);
902 float common =
D * 0.25f / cosNO;
903 float out =
G * common;
926 float alpha_y = bsdf->alpha_y;
927 float m_eta = bsdf->ior;
931 if (!m_refractive || alpha_x * alpha_y <= 1e-7f) {
936 float cosNO =
dot(
N,
I);
937 float cosNI =
dot(
N, omega_in);
939 if (cosNO <= 0 || cosNI >= 0) {
944 float3 ht = -(m_eta * omega_in +
I);
946 float cosHO =
dot(Ht,
I);
947 float cosHI =
dot(Ht, omega_in);
950 float alpha2 = alpha_x * alpha_y;
951 float cosThetaM =
min(
dot(
N, Ht), 1.0f);
952 float cosThetaM2 = cosThetaM * cosThetaM;
953 float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
954 float cosThetaM4 = cosThetaM2 * cosThetaM2;
955 float D =
expf(-tanThetaM2 / alpha2) / (
M_PI_F * alpha2 * cosThetaM4);
963 float Ht2 =
dot(ht, ht);
970 float common =
D * (m_eta * m_eta) / (cosNO * Ht2);
971 float out =
G *
fabsf(cosHI * cosHO) * common;
972 *pdf = G1o *
fabsf(cosHO * cosHI) * common;
993 float alpha_y = bsdf->alpha_y;
998 float cosNO =
dot(
N,
I);
1002 if (alpha_x == alpha_y)
1015 float3 m =
X * local_m.
x +
Y * local_m.
y +
Z * local_m.
z;
1016 float cosThetaM = local_m.
z;
1019 if (!m_refractive) {
1021 float cosMO =
dot(m,
I);
1025 *omega_in = 2 * cosMO * m -
I;
1027 if (
dot(Ng, *omega_in) > 0) {
1028 if (alpha_x * alpha_y <= 1e-7f) {
1037 float alpha2 = alpha_x * alpha_y;
1040 if (alpha_x == alpha_y) {
1042 float cosThetaM2 = cosThetaM * cosThetaM;
1043 float cosThetaM4 = cosThetaM2 * cosThetaM2;
1044 float tanThetaM2 = 1 / (cosThetaM2)-1;
1045 D =
expf(-tanThetaM2 / alpha2) / (
M_PI_F * alpha2 * cosThetaM4);
1048 float cosNI =
dot(
N, *omega_in);
1056 float slope_x = -local_m.
x / (local_m.
z * alpha_x);
1057 float slope_y = -local_m.
y / (local_m.
z * alpha_y);
1059 float cosThetaM = local_m.
z;
1060 float cosThetaM2 = cosThetaM * cosThetaM;
1061 float cosThetaM4 = cosThetaM2 * cosThetaM2;
1063 D =
expf(-slope_x * slope_x - slope_y * slope_y) / (
M_PI_F * alpha2 * cosThetaM4);
1067 alpha_x, alpha_y,
dot(*omega_in,
N),
dot(*omega_in,
X),
dot(*omega_in,
Y));
1070 float G = G1o * G1i;
1073 float common =
D * 0.25f / cosNO;
1074 float out =
G * common;
1075 *pdf = G1o * common;
1080 #ifdef __RAY_DIFFERENTIALS__
1081 *domega_in_dx = (2 *
dot(m, dIdx)) * m - dIdx;
1082 *domega_in_dy = (2 *
dot(m, dIdy)) * m - dIdy;
1097 #ifdef __RAY_DIFFERENTIALS__
1098 float3 dRdx, dRdy, dTdx, dTdy;
1100 float m_eta = bsdf->ior, fresnel;
1118 if (!inside && fresnel != 1.0f) {
1121 #ifdef __RAY_DIFFERENTIALS__
1122 *domega_in_dx = dTdx;
1123 *domega_in_dy = dTdy;
1126 if (alpha_x * alpha_y <= 1e-7f ||
fabsf(m_eta - 1.0f) < 1e-4f) {
1134 float alpha2 = alpha_x * alpha_y;
1135 float cosThetaM2 = cosThetaM * cosThetaM;
1136 float cosThetaM4 = cosThetaM2 * cosThetaM2;
1137 float tanThetaM2 = 1 / (cosThetaM2)-1;
1138 float D =
expf(-tanThetaM2 / alpha2) / (
M_PI_F * alpha2 * cosThetaM4);
1141 float cosNI =
dot(
N, *omega_in);
1145 float G = G1o * G1i;
1148 float cosHI =
dot(m, *omega_in);
1149 float cosHO =
dot(m,
I);
1150 float Ht2 = m_eta * cosHI + cosHO;
1154 float common =
D * (m_eta * m_eta) / (cosNO * Ht2);
1155 float out =
G *
fabsf(cosHI * cosHO) * common;
1156 *pdf = G1o * cosHO *
fabsf(cosHI) * common;
MINLINE float safe_sqrtf(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 z
_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 GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_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
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color or the default fallback if none is specified Separate Split a vector into its X
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between and object coordinate space Combine Create a color from its and value channels Color Retrieve a color or the default fallback if none is specified Separate Split a vector into its Y
ccl_device_inline float bsdf_beckmann_G1(float alpha, float cos_n)
ccl_device float3 bsdf_microfacet_ggx_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals kg, const float3 omega_i, const float alpha_x, const float alpha_y, const float randu, const float randv, bool beckmann, ccl_private float *G1i)
ccl_device void bsdf_microfacet_ggx_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device int bsdf_microfacet_beckmann_isotropic_setup(ccl_private MicrofacetBsdf *bsdf)
struct MicrofacetBsdf MicrofacetBsdf
ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals kg, 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_NAMESPACE_BEGIN struct MicrofacetExtra MicrofacetExtra
ccl_device int bsdf_microfacet_beckmann_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsdf, ccl_private const ShaderData *sd)
ccl_device_forceinline float D_GTR1(float NdotH, float alpha)
ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals kg, 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_inline float bsdf_beckmann_aniso_G1(float alpha_x, float alpha_y, float cos_n, float cos_phi, float sin_phi)
ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *bsdf, ccl_private const ShaderData *sd)
ccl_device float3 bsdf_microfacet_beckmann_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_microfacet_ggx_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_microfacet_beckmann_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device_forceinline float3 reflection_color(ccl_private const MicrofacetBsdf *bsdf, float3 L, float3 H)
ccl_device_forceinline void bsdf_microfacet_fresnel_color(ccl_private const ShaderData *sd, ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_isotropic_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device void bsdf_microfacet_beckmann_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device_inline void microfacet_beckmann_sample_slopes(KernelGlobals kg, const float cos_theta_i, const float sin_theta_i, float randu, float randv, ccl_private float *slope_x, ccl_private float *slope_y, ccl_private float *G1i)
ccl_device_inline void microfacet_ggx_sample_slopes(const float cos_theta_i, const float sin_theta_i, float randu, float randv, ccl_private float *slope_x, ccl_private float *slope_y, ccl_private float *G1i)
ccl_device float fresnel_dielectric_cos(float cosi, float eta)
CCL_NAMESPACE_BEGIN ccl_device float fresnel_dielectric(float eta, const float3 N, const float3 I, ccl_private float3 *R, ccl_private float3 *T, ccl_private bool *is_inside)
ccl_device_forceinline float3 interpolate_fresnel_color(float3 L, float3 H, float ior, float F0, float3 cspec0)
#define kernel_assert(cond)
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define CLOSURE_IS_BSDF_MICROFACET_FRESNEL(type)
@ CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID
@ CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_GGX_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_ID
@ CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID
#define BECKMANN_TABLE_SIZE
#define __RAY_DIFFERENTIALS__
ccl_device float lookup_table_read_2D(KernelGlobals kg, float x, float y, int offset, int xsize, int ysize)
ccl_device_inline float fast_erff(float x)
ccl_device_inline float fast_ierff(float x)
ccl_device_inline float average(const float2 &a)
ccl_device_inline float3 saturate(float3 a)
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
ccl_device void make_orthonormals_tangent(const float3 N, const float3 T, ccl_private float3 *a, ccl_private float3 *b)
ccl_private MicrofacetExtra * extra
ccl_device_inline float saturatef(float a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)
BLI_INLINE float D(const float *data, const int res[3], int x, int y, int z)