bsdf_microfacet.h 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197
  1. /*
  2. * Adapted from Open Shading Language with this license:
  3. *
  4. * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
  5. * All Rights Reserved.
  6. *
  7. * Modifications Copyright 2011, Blender Foundation.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions are
  11. * met:
  12. * * Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * * Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in the
  16. * documentation and/or other materials provided with the distribution.
  17. * * Neither the name of Sony Pictures Imageworks nor the names of its
  18. * contributors may be used to endorse or promote products derived from
  19. * this software without specific prior written permission.
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __BSDF_MICROFACET_H__
  33. #define __BSDF_MICROFACET_H__
  34. CCL_NAMESPACE_BEGIN
  35. typedef ccl_addr_space struct MicrofacetExtra {
  36. float3 color, cspec0;
  37. float clearcoat;
  38. } MicrofacetExtra;
  39. typedef ccl_addr_space struct MicrofacetBsdf {
  40. SHADER_CLOSURE_BASE;
  41. float alpha_x, alpha_y, ior;
  42. MicrofacetExtra *extra;
  43. float3 T;
  44. } MicrofacetBsdf;
  45. static_assert(sizeof(ShaderClosure) >= sizeof(MicrofacetBsdf), "MicrofacetBsdf is too large!");
  46. /* Beckmann and GGX microfacet importance sampling. */
  47. ccl_device_inline void microfacet_beckmann_sample_slopes(KernelGlobals *kg,
  48. const float cos_theta_i,
  49. const float sin_theta_i,
  50. float randu,
  51. float randv,
  52. float *slope_x,
  53. float *slope_y,
  54. float *G1i)
  55. {
  56. /* special case (normal incidence) */
  57. if (cos_theta_i >= 0.99999f) {
  58. const float r = sqrtf(-logf(randu));
  59. const float phi = M_2PI_F * randv;
  60. *slope_x = r * cosf(phi);
  61. *slope_y = r * sinf(phi);
  62. *G1i = 1.0f;
  63. return;
  64. }
  65. /* precomputations */
  66. const float tan_theta_i = sin_theta_i / cos_theta_i;
  67. const float inv_a = tan_theta_i;
  68. const float cot_theta_i = 1.0f / tan_theta_i;
  69. const float erf_a = fast_erff(cot_theta_i);
  70. const float exp_a2 = expf(-cot_theta_i * cot_theta_i);
  71. const float SQRT_PI_INV = 0.56418958354f;
  72. const float Lambda = 0.5f * (erf_a - 1.0f) + (0.5f * SQRT_PI_INV) * (exp_a2 * inv_a);
  73. const float G1 = 1.0f / (1.0f + Lambda); /* masking */
  74. *G1i = G1;
  75. #if defined(__KERNEL_GPU__)
  76. /* Based on paper from Wenzel Jakob
  77. * An Improved Visible Normal Sampling Routine for the Beckmann Distribution
  78. *
  79. * http://www.mitsuba-renderer.org/~wenzel/files/visnormal.pdf
  80. *
  81. * Reformulation from OpenShadingLanguage which avoids using inverse
  82. * trigonometric functions.
  83. */
  84. /* Sample slope X.
  85. *
  86. * Compute a coarse approximation using the approximation:
  87. * exp(-ierf(x)^2) ~= 1 - x * x
  88. * solve y = 1 + b + K * (1 - b * b)
  89. */
  90. float K = tan_theta_i * SQRT_PI_INV;
  91. float y_approx = randu * (1.0f + erf_a + K * (1 - erf_a * erf_a));
  92. float y_exact = randu * (1.0f + erf_a + K * exp_a2);
  93. float b = K > 0 ? (0.5f - sqrtf(K * (K - y_approx + 1.0f) + 0.25f)) / K : y_approx - 1.0f;
  94. /* Perform newton step to refine toward the true root. */
  95. float inv_erf = fast_ierff(b);
  96. float value = 1.0f + b + K * expf(-inv_erf * inv_erf) - y_exact;
  97. /* Check if we are close enough already,
  98. * this also avoids NaNs as we get close to the root.
  99. */
  100. if (fabsf(value) > 1e-6f) {
  101. b -= value / (1.0f - inv_erf * tan_theta_i); /* newton step 1. */
  102. inv_erf = fast_ierff(b);
  103. value = 1.0f + b + K * expf(-inv_erf * inv_erf) - y_exact;
  104. b -= value / (1.0f - inv_erf * tan_theta_i); /* newton step 2. */
  105. /* Compute the slope from the refined value. */
  106. *slope_x = fast_ierff(b);
  107. }
  108. else {
  109. /* We are close enough already. */
  110. *slope_x = inv_erf;
  111. }
  112. *slope_y = fast_ierff(2.0f * randv - 1.0f);
  113. #else
  114. /* Use precomputed table on CPU, it gives better perfomance. */
  115. int beckmann_table_offset = kernel_data.tables.beckmann_offset;
  116. *slope_x = lookup_table_read_2D(
  117. kg, randu, cos_theta_i, beckmann_table_offset, BECKMANN_TABLE_SIZE, BECKMANN_TABLE_SIZE);
  118. *slope_y = fast_ierff(2.0f * randv - 1.0f);
  119. #endif
  120. }
  121. /* GGX microfacet importance sampling from:
  122. *
  123. * Importance Sampling Microfacet-Based BSDFs using the Distribution of Visible Normals.
  124. * E. Heitz and E. d'Eon, EGSR 2014
  125. */
  126. ccl_device_inline void microfacet_ggx_sample_slopes(const float cos_theta_i,
  127. const float sin_theta_i,
  128. float randu,
  129. float randv,
  130. float *slope_x,
  131. float *slope_y,
  132. float *G1i)
  133. {
  134. /* special case (normal incidence) */
  135. if (cos_theta_i >= 0.99999f) {
  136. const float r = sqrtf(randu / (1.0f - randu));
  137. const float phi = M_2PI_F * randv;
  138. *slope_x = r * cosf(phi);
  139. *slope_y = r * sinf(phi);
  140. *G1i = 1.0f;
  141. return;
  142. }
  143. /* precomputations */
  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));
  146. *G1i = 1.0f / G1_inv;
  147. /* sample slope_x */
  148. const float A = 2.0f * randu * G1_inv - 1.0f;
  149. const float AA = A * A;
  150. const float tmp = 1.0f / (AA - 1.0f);
  151. const float B = tan_theta_i;
  152. const float BB = B * B;
  153. const float D = safe_sqrtf(BB * (tmp * tmp) - (AA - BB) * tmp);
  154. const float slope_x_1 = B * tmp - D;
  155. const float slope_x_2 = B * tmp + D;
  156. *slope_x = (A < 0.0f || slope_x_2 * tan_theta_i > 1.0f) ? slope_x_1 : slope_x_2;
  157. /* sample slope_y */
  158. float S;
  159. if (randv > 0.5f) {
  160. S = 1.0f;
  161. randv = 2.0f * (randv - 0.5f);
  162. }
  163. else {
  164. S = -1.0f;
  165. randv = 2.0f * (0.5f - randv);
  166. }
  167. const float z = (randv * (randv * (randv * 0.27385f - 0.73369f) + 0.46341f)) /
  168. (randv * (randv * (randv * 0.093073f + 0.309420f) - 1.000000f) + 0.597999f);
  169. *slope_y = S * z * safe_sqrtf(1.0f + (*slope_x) * (*slope_x));
  170. }
  171. ccl_device_forceinline float3 microfacet_sample_stretched(KernelGlobals *kg,
  172. const float3 omega_i,
  173. const float alpha_x,
  174. const float alpha_y,
  175. const float randu,
  176. const float randv,
  177. bool beckmann,
  178. float *G1i)
  179. {
  180. /* 1. stretch omega_i */
  181. float3 omega_i_ = make_float3(alpha_x * omega_i.x, alpha_y * omega_i.y, omega_i.z);
  182. omega_i_ = normalize(omega_i_);
  183. /* get polar coordinates of omega_i_ */
  184. float costheta_ = 1.0f;
  185. float sintheta_ = 0.0f;
  186. float cosphi_ = 1.0f;
  187. float sinphi_ = 0.0f;
  188. if (omega_i_.z < 0.99999f) {
  189. costheta_ = omega_i_.z;
  190. sintheta_ = safe_sqrtf(1.0f - costheta_ * costheta_);
  191. float invlen = 1.0f / sintheta_;
  192. cosphi_ = omega_i_.x * invlen;
  193. sinphi_ = omega_i_.y * invlen;
  194. }
  195. /* 2. sample P22_{omega_i}(x_slope, y_slope, 1, 1) */
  196. float slope_x, slope_y;
  197. if (beckmann) {
  198. microfacet_beckmann_sample_slopes(
  199. kg, costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i);
  200. }
  201. else {
  202. microfacet_ggx_sample_slopes(costheta_, sintheta_, randu, randv, &slope_x, &slope_y, G1i);
  203. }
  204. /* 3. rotate */
  205. float tmp = cosphi_ * slope_x - sinphi_ * slope_y;
  206. slope_y = sinphi_ * slope_x + cosphi_ * slope_y;
  207. slope_x = tmp;
  208. /* 4. unstretch */
  209. slope_x = alpha_x * slope_x;
  210. slope_y = alpha_y * slope_y;
  211. /* 5. compute normal */
  212. return normalize(make_float3(-slope_x, -slope_y, 1.0f));
  213. }
  214. /* Calculate the reflection color
  215. *
  216. * If fresnel is used, the color is an interpolation of the F0 color and white
  217. * with respect to the fresnel
  218. *
  219. * Else it is simply white
  220. */
  221. ccl_device_forceinline float3 reflection_color(const MicrofacetBsdf *bsdf, float3 L, float3 H)
  222. {
  223. float3 F = make_float3(1.0f, 1.0f, 1.0f);
  224. bool use_fresnel = (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID ||
  225. bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID ||
  226. bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID);
  227. if (use_fresnel) {
  228. float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
  229. F = interpolate_fresnel_color(L, H, bsdf->ior, F0, bsdf->extra->cspec0);
  230. }
  231. return F;
  232. }
  233. ccl_device_forceinline float D_GTR1(float NdotH, float alpha)
  234. {
  235. if (alpha >= 1.0f)
  236. return M_1_PI_F;
  237. float alpha2 = alpha * alpha;
  238. float t = 1.0f + (alpha2 - 1.0f) * NdotH * NdotH;
  239. return (alpha2 - 1.0f) / (M_PI_F * logf(alpha2) * t);
  240. }
  241. /* GGX microfacet with Smith shadow-masking from:
  242. *
  243. * Microfacet Models for Refraction through Rough Surfaces
  244. * B. Walter, S. R. Marschner, H. Li, K. E. Torrance, EGSR 2007
  245. *
  246. * Anisotropic from:
  247. *
  248. * Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs
  249. * E. Heitz, Research Report 2014
  250. *
  251. * Anisotropy is only supported for reflection currently, but adding it for
  252. * transmission is just a matter of copying code from reflection if needed. */
  253. ccl_device int bsdf_microfacet_ggx_setup(MicrofacetBsdf *bsdf)
  254. {
  255. bsdf->extra = NULL;
  256. bsdf->alpha_x = saturate(bsdf->alpha_x);
  257. bsdf->alpha_y = bsdf->alpha_x;
  258. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
  259. return SD_BSDF | SD_BSDF_HAS_EVAL;
  260. }
  261. ccl_device int bsdf_microfacet_ggx_fresnel_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
  262. {
  263. bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
  264. bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
  265. bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
  266. float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
  267. float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
  268. bsdf->sample_weight *= F;
  269. bsdf->alpha_x = saturate(bsdf->alpha_x);
  270. bsdf->alpha_y = bsdf->alpha_x;
  271. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID;
  272. return SD_BSDF | SD_BSDF_HAS_EVAL;
  273. }
  274. ccl_device int bsdf_microfacet_ggx_clearcoat_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
  275. {
  276. bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
  277. bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
  278. bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
  279. float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
  280. float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
  281. bsdf->sample_weight *= 0.25f * bsdf->extra->clearcoat * F;
  282. bsdf->alpha_x = saturate(bsdf->alpha_x);
  283. bsdf->alpha_y = bsdf->alpha_x;
  284. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
  285. return SD_BSDF | SD_BSDF_HAS_EVAL;
  286. }
  287. ccl_device bool bsdf_microfacet_merge(const ShaderClosure *a, const ShaderClosure *b)
  288. {
  289. const MicrofacetBsdf *bsdf_a = (const MicrofacetBsdf *)a;
  290. const MicrofacetBsdf *bsdf_b = (const MicrofacetBsdf *)b;
  291. return (isequal_float3(bsdf_a->N, bsdf_b->N)) && (bsdf_a->alpha_x == bsdf_b->alpha_x) &&
  292. (bsdf_a->alpha_y == bsdf_b->alpha_y) && (isequal_float3(bsdf_a->T, bsdf_b->T)) &&
  293. (bsdf_a->ior == bsdf_b->ior) &&
  294. ((bsdf_a->extra == NULL && bsdf_b->extra == NULL) ||
  295. ((bsdf_a->extra && bsdf_b->extra) &&
  296. (isequal_float3(bsdf_a->extra->color, bsdf_b->extra->color)) &&
  297. (isequal_float3(bsdf_a->extra->cspec0, bsdf_b->extra->cspec0)) &&
  298. (bsdf_a->extra->clearcoat == bsdf_b->extra->clearcoat)));
  299. }
  300. ccl_device int bsdf_microfacet_ggx_aniso_setup(MicrofacetBsdf *bsdf)
  301. {
  302. bsdf->extra = NULL;
  303. bsdf->alpha_x = saturate(bsdf->alpha_x);
  304. bsdf->alpha_y = saturate(bsdf->alpha_y);
  305. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID;
  306. return SD_BSDF | SD_BSDF_HAS_EVAL;
  307. }
  308. ccl_device int bsdf_microfacet_ggx_aniso_fresnel_setup(MicrofacetBsdf *bsdf, const ShaderData *sd)
  309. {
  310. bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
  311. bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
  312. bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
  313. float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
  314. float F = average(interpolate_fresnel_color(sd->I, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0));
  315. bsdf->sample_weight *= F;
  316. bsdf->alpha_x = saturate(bsdf->alpha_x);
  317. bsdf->alpha_y = saturate(bsdf->alpha_y);
  318. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID;
  319. return SD_BSDF | SD_BSDF_HAS_EVAL;
  320. }
  321. ccl_device int bsdf_microfacet_ggx_refraction_setup(MicrofacetBsdf *bsdf)
  322. {
  323. bsdf->extra = NULL;
  324. bsdf->alpha_x = saturate(bsdf->alpha_x);
  325. bsdf->alpha_y = bsdf->alpha_x;
  326. bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
  327. return SD_BSDF | SD_BSDF_HAS_EVAL;
  328. }
  329. ccl_device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
  330. {
  331. MicrofacetBsdf *bsdf = (MicrofacetBsdf *)sc;
  332. bsdf->alpha_x = fmaxf(roughness, bsdf->alpha_x);
  333. bsdf->alpha_y = fmaxf(roughness, bsdf->alpha_y);
  334. }
  335. ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc,
  336. const float3 I,
  337. const float3 omega_in,
  338. float *pdf)
  339. {
  340. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  341. float alpha_x = bsdf->alpha_x;
  342. float alpha_y = bsdf->alpha_y;
  343. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
  344. float3 N = bsdf->N;
  345. if (m_refractive || alpha_x * alpha_y <= 1e-7f)
  346. return make_float3(0.0f, 0.0f, 0.0f);
  347. float cosNO = dot(N, I);
  348. float cosNI = dot(N, omega_in);
  349. if (cosNI > 0 && cosNO > 0) {
  350. /* get half vector */
  351. float3 m = normalize(omega_in + I);
  352. float alpha2 = alpha_x * alpha_y;
  353. float D, G1o, G1i;
  354. if (alpha_x == alpha_y) {
  355. /* isotropic
  356. * eq. 20: (F*G*D)/(4*in*on)
  357. * eq. 33: first we calculate D(m) */
  358. float cosThetaM = dot(N, m);
  359. float cosThetaM2 = cosThetaM * cosThetaM;
  360. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  361. float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
  362. if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
  363. /* use GTR1 for clearcoat */
  364. D = D_GTR1(cosThetaM, bsdf->alpha_x);
  365. /* the alpha value for clearcoat is a fixed 0.25 => alpha2 = 0.25 * 0.25 */
  366. alpha2 = 0.0625f;
  367. }
  368. else {
  369. /* use GTR2 otherwise */
  370. D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
  371. }
  372. /* eq. 34: now calculate G1(i,m) and G1(o,m) */
  373. G1o = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
  374. G1i = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
  375. }
  376. else {
  377. /* anisotropic */
  378. float3 X, Y, Z = N;
  379. make_orthonormals_tangent(Z, bsdf->T, &X, &Y);
  380. /* distribution */
  381. float3 local_m = make_float3(dot(X, m), dot(Y, m), dot(Z, m));
  382. float slope_x = -local_m.x / (local_m.z * alpha_x);
  383. float slope_y = -local_m.y / (local_m.z * alpha_y);
  384. float slope_len = 1 + slope_x * slope_x + slope_y * slope_y;
  385. float cosThetaM = local_m.z;
  386. float cosThetaM2 = cosThetaM * cosThetaM;
  387. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  388. D = 1 / ((slope_len * slope_len) * M_PI_F * alpha2 * cosThetaM4);
  389. /* G1(i,m) and G1(o,m) */
  390. float tanThetaO2 = (1 - cosNO * cosNO) / (cosNO * cosNO);
  391. float cosPhiO = dot(I, X);
  392. float sinPhiO = dot(I, Y);
  393. float alphaO2 = (cosPhiO * cosPhiO) * (alpha_x * alpha_x) +
  394. (sinPhiO * sinPhiO) * (alpha_y * alpha_y);
  395. alphaO2 /= cosPhiO * cosPhiO + sinPhiO * sinPhiO;
  396. G1o = 2 / (1 + safe_sqrtf(1 + alphaO2 * tanThetaO2));
  397. float tanThetaI2 = (1 - cosNI * cosNI) / (cosNI * cosNI);
  398. float cosPhiI = dot(omega_in, X);
  399. float sinPhiI = dot(omega_in, Y);
  400. float alphaI2 = (cosPhiI * cosPhiI) * (alpha_x * alpha_x) +
  401. (sinPhiI * sinPhiI) * (alpha_y * alpha_y);
  402. alphaI2 /= cosPhiI * cosPhiI + sinPhiI * sinPhiI;
  403. G1i = 2 / (1 + safe_sqrtf(1 + alphaI2 * tanThetaI2));
  404. }
  405. float G = G1o * G1i;
  406. /* eq. 20 */
  407. float common = D * 0.25f / cosNO;
  408. float3 F = reflection_color(bsdf, omega_in, m);
  409. if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
  410. F *= 0.25f * bsdf->extra->clearcoat;
  411. }
  412. float3 out = F * G * common;
  413. /* eq. 2 in distribution of visible normals sampling
  414. * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
  415. /* eq. 38 - but see also:
  416. * eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
  417. * pdf = pm * 0.25 / dot(m, I); */
  418. *pdf = G1o * common;
  419. return out;
  420. }
  421. return make_float3(0.0f, 0.0f, 0.0f);
  422. }
  423. ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc,
  424. const float3 I,
  425. const float3 omega_in,
  426. float *pdf)
  427. {
  428. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  429. float alpha_x = bsdf->alpha_x;
  430. float alpha_y = bsdf->alpha_y;
  431. float m_eta = bsdf->ior;
  432. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
  433. float3 N = bsdf->N;
  434. if (!m_refractive || alpha_x * alpha_y <= 1e-7f)
  435. return make_float3(0.0f, 0.0f, 0.0f);
  436. float cosNO = dot(N, I);
  437. float cosNI = dot(N, omega_in);
  438. if (cosNO <= 0 || cosNI >= 0)
  439. return make_float3(0.0f, 0.0f, 0.0f); /* vectors on same side -- not possible */
  440. /* compute half-vector of the refraction (eq. 16) */
  441. float3 ht = -(m_eta * omega_in + I);
  442. float3 Ht = normalize(ht);
  443. float cosHO = dot(Ht, I);
  444. float cosHI = dot(Ht, omega_in);
  445. float D, G1o, G1i;
  446. /* eq. 33: first we calculate D(m) with m=Ht: */
  447. float alpha2 = alpha_x * alpha_y;
  448. float cosThetaM = dot(N, Ht);
  449. float cosThetaM2 = cosThetaM * cosThetaM;
  450. float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
  451. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  452. D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
  453. /* eq. 34: now calculate G1(i,m) and G1(o,m) */
  454. G1o = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
  455. G1i = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
  456. float G = G1o * G1i;
  457. /* probability */
  458. float Ht2 = dot(ht, ht);
  459. /* eq. 2 in distribution of visible normals sampling
  460. * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
  461. /* out = fabsf(cosHI * cosHO) * (m_eta * m_eta) * G * D / (cosNO * Ht2)
  462. * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */
  463. float common = D * (m_eta * m_eta) / (cosNO * Ht2);
  464. float out = G * fabsf(cosHI * cosHO) * common;
  465. *pdf = G1o * fabsf(cosHO * cosHI) * common;
  466. return make_float3(out, out, out);
  467. }
  468. ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg,
  469. const ShaderClosure *sc,
  470. float3 Ng,
  471. float3 I,
  472. float3 dIdx,
  473. float3 dIdy,
  474. float randu,
  475. float randv,
  476. float3 *eval,
  477. float3 *omega_in,
  478. float3 *domega_in_dx,
  479. float3 *domega_in_dy,
  480. float *pdf)
  481. {
  482. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  483. float alpha_x = bsdf->alpha_x;
  484. float alpha_y = bsdf->alpha_y;
  485. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
  486. float3 N = bsdf->N;
  487. int label;
  488. float cosNO = dot(N, I);
  489. if (cosNO > 0) {
  490. float3 X, Y, Z = N;
  491. if (alpha_x == alpha_y)
  492. make_orthonormals(Z, &X, &Y);
  493. else
  494. make_orthonormals_tangent(Z, bsdf->T, &X, &Y);
  495. /* importance sampling with distribution of visible normals. vectors are
  496. * transformed to local space before and after */
  497. float3 local_I = make_float3(dot(X, I), dot(Y, I), cosNO);
  498. float3 local_m;
  499. float G1o;
  500. local_m = microfacet_sample_stretched(
  501. kg, local_I, alpha_x, alpha_y, randu, randv, false, &G1o);
  502. float3 m = X * local_m.x + Y * local_m.y + Z * local_m.z;
  503. float cosThetaM = local_m.z;
  504. /* reflection or refraction? */
  505. if (!m_refractive) {
  506. float cosMO = dot(m, I);
  507. label = LABEL_REFLECT | LABEL_GLOSSY;
  508. if (cosMO > 0) {
  509. /* eq. 39 - compute actual reflected direction */
  510. *omega_in = 2 * cosMO * m - I;
  511. if (dot(Ng, *omega_in) > 0) {
  512. if (alpha_x * alpha_y <= 1e-7f) {
  513. /* some high number for MIS */
  514. *pdf = 1e6f;
  515. *eval = make_float3(1e6f, 1e6f, 1e6f);
  516. bool use_fresnel = (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID ||
  517. bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID ||
  518. bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID);
  519. /* if fresnel is used, calculate the color with reflection_color(...) */
  520. if (use_fresnel) {
  521. *eval *= reflection_color(bsdf, *omega_in, m);
  522. }
  523. label = LABEL_REFLECT | LABEL_SINGULAR;
  524. }
  525. else {
  526. /* microfacet normal is visible to this ray */
  527. /* eq. 33 */
  528. float alpha2 = alpha_x * alpha_y;
  529. float D, G1i;
  530. if (alpha_x == alpha_y) {
  531. /* isotropic */
  532. float cosThetaM2 = cosThetaM * cosThetaM;
  533. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  534. float tanThetaM2 = 1 / (cosThetaM2)-1;
  535. /* eval BRDF*cosNI */
  536. float cosNI = dot(N, *omega_in);
  537. if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
  538. /* use GTR1 for clearcoat */
  539. D = D_GTR1(cosThetaM, bsdf->alpha_x);
  540. /* the alpha value for clearcoat is a fixed 0.25 => alpha2 = 0.25 * 0.25 */
  541. alpha2 = 0.0625f;
  542. /* recalculate G1o */
  543. G1o = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
  544. }
  545. else {
  546. /* use GTR2 otherwise */
  547. D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
  548. }
  549. /* eq. 34: now calculate G1(i,m) */
  550. G1i = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
  551. }
  552. else {
  553. /* anisotropic distribution */
  554. float3 local_m = make_float3(dot(X, m), dot(Y, m), dot(Z, m));
  555. float slope_x = -local_m.x / (local_m.z * alpha_x);
  556. float slope_y = -local_m.y / (local_m.z * alpha_y);
  557. float slope_len = 1 + slope_x * slope_x + slope_y * slope_y;
  558. float cosThetaM = local_m.z;
  559. float cosThetaM2 = cosThetaM * cosThetaM;
  560. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  561. D = 1 / ((slope_len * slope_len) * M_PI_F * alpha2 * cosThetaM4);
  562. /* calculate G1(i,m) */
  563. float cosNI = dot(N, *omega_in);
  564. float tanThetaI2 = (1 - cosNI * cosNI) / (cosNI * cosNI);
  565. float cosPhiI = dot(*omega_in, X);
  566. float sinPhiI = dot(*omega_in, Y);
  567. float alphaI2 = (cosPhiI * cosPhiI) * (alpha_x * alpha_x) +
  568. (sinPhiI * sinPhiI) * (alpha_y * alpha_y);
  569. alphaI2 /= cosPhiI * cosPhiI + sinPhiI * sinPhiI;
  570. G1i = 2 / (1 + safe_sqrtf(1 + alphaI2 * tanThetaI2));
  571. }
  572. /* see eval function for derivation */
  573. float common = (G1o * D) * 0.25f / cosNO;
  574. *pdf = common;
  575. float3 F = reflection_color(bsdf, *omega_in, m);
  576. *eval = G1i * common * F;
  577. }
  578. if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
  579. *eval *= 0.25f * bsdf->extra->clearcoat;
  580. }
  581. #ifdef __RAY_DIFFERENTIALS__
  582. *domega_in_dx = (2 * dot(m, dIdx)) * m - dIdx;
  583. *domega_in_dy = (2 * dot(m, dIdy)) * m - dIdy;
  584. #endif
  585. }
  586. }
  587. }
  588. else {
  589. label = LABEL_TRANSMIT | LABEL_GLOSSY;
  590. /* CAUTION: the i and o variables are inverted relative to the paper
  591. * eq. 39 - compute actual refractive direction */
  592. float3 R, T;
  593. #ifdef __RAY_DIFFERENTIALS__
  594. float3 dRdx, dRdy, dTdx, dTdy;
  595. #endif
  596. float m_eta = bsdf->ior, fresnel;
  597. bool inside;
  598. fresnel = fresnel_dielectric(m_eta,
  599. m,
  600. I,
  601. &R,
  602. &T,
  603. #ifdef __RAY_DIFFERENTIALS__
  604. dIdx,
  605. dIdy,
  606. &dRdx,
  607. &dRdy,
  608. &dTdx,
  609. &dTdy,
  610. #endif
  611. &inside);
  612. if (!inside && fresnel != 1.0f) {
  613. *omega_in = T;
  614. #ifdef __RAY_DIFFERENTIALS__
  615. *domega_in_dx = dTdx;
  616. *domega_in_dy = dTdy;
  617. #endif
  618. if (alpha_x * alpha_y <= 1e-7f || fabsf(m_eta - 1.0f) < 1e-4f) {
  619. /* some high number for MIS */
  620. *pdf = 1e6f;
  621. *eval = make_float3(1e6f, 1e6f, 1e6f);
  622. label = LABEL_TRANSMIT | LABEL_SINGULAR;
  623. }
  624. else {
  625. /* eq. 33 */
  626. float alpha2 = alpha_x * alpha_y;
  627. float cosThetaM2 = cosThetaM * cosThetaM;
  628. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  629. float tanThetaM2 = 1 / (cosThetaM2)-1;
  630. float D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
  631. /* eval BRDF*cosNI */
  632. float cosNI = dot(N, *omega_in);
  633. /* eq. 34: now calculate G1(i,m) */
  634. float G1i = 2 / (1 + safe_sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
  635. /* eq. 21 */
  636. float cosHI = dot(m, *omega_in);
  637. float cosHO = dot(m, I);
  638. float Ht2 = m_eta * cosHI + cosHO;
  639. Ht2 *= Ht2;
  640. /* see eval function for derivation */
  641. float common = (G1o * D) * (m_eta * m_eta) / (cosNO * Ht2);
  642. float out = G1i * fabsf(cosHI * cosHO) * common;
  643. *pdf = cosHO * fabsf(cosHI) * common;
  644. *eval = make_float3(out, out, out);
  645. }
  646. }
  647. }
  648. }
  649. else {
  650. label = (m_refractive) ? LABEL_TRANSMIT | LABEL_GLOSSY : LABEL_REFLECT | LABEL_GLOSSY;
  651. }
  652. return label;
  653. }
  654. /* Beckmann microfacet with Smith shadow-masking from:
  655. *
  656. * Microfacet Models for Refraction through Rough Surfaces
  657. * B. Walter, S. R. Marschner, H. Li, K. E. Torrance, EGSR 2007 */
  658. ccl_device int bsdf_microfacet_beckmann_setup(MicrofacetBsdf *bsdf)
  659. {
  660. bsdf->alpha_x = saturate(bsdf->alpha_x);
  661. bsdf->alpha_y = bsdf->alpha_x;
  662. bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ID;
  663. return SD_BSDF | SD_BSDF_HAS_EVAL;
  664. }
  665. ccl_device int bsdf_microfacet_beckmann_aniso_setup(MicrofacetBsdf *bsdf)
  666. {
  667. bsdf->alpha_x = saturate(bsdf->alpha_x);
  668. bsdf->alpha_y = saturate(bsdf->alpha_y);
  669. bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID;
  670. return SD_BSDF | SD_BSDF_HAS_EVAL;
  671. }
  672. ccl_device int bsdf_microfacet_beckmann_refraction_setup(MicrofacetBsdf *bsdf)
  673. {
  674. bsdf->alpha_x = saturate(bsdf->alpha_x);
  675. bsdf->alpha_y = bsdf->alpha_x;
  676. bsdf->type = CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
  677. return SD_BSDF | SD_BSDF_HAS_EVAL;
  678. }
  679. ccl_device void bsdf_microfacet_beckmann_blur(ShaderClosure *sc, float roughness)
  680. {
  681. MicrofacetBsdf *bsdf = (MicrofacetBsdf *)sc;
  682. bsdf->alpha_x = fmaxf(roughness, bsdf->alpha_x);
  683. bsdf->alpha_y = fmaxf(roughness, bsdf->alpha_y);
  684. }
  685. ccl_device_inline float bsdf_beckmann_G1(float alpha, float cos_n)
  686. {
  687. cos_n *= cos_n;
  688. float invA = alpha * safe_sqrtf((1.0f - cos_n) / cos_n);
  689. if (invA < 0.625f) {
  690. return 1.0f;
  691. }
  692. float a = 1.0f / invA;
  693. return ((2.181f * a + 3.535f) * a) / ((2.577f * a + 2.276f) * a + 1.0f);
  694. }
  695. ccl_device_inline float bsdf_beckmann_aniso_G1(
  696. float alpha_x, float alpha_y, float cos_n, float cos_phi, float sin_phi)
  697. {
  698. cos_n *= cos_n;
  699. sin_phi *= sin_phi;
  700. cos_phi *= cos_phi;
  701. alpha_x *= alpha_x;
  702. alpha_y *= alpha_y;
  703. float alphaO2 = (cos_phi * alpha_x + sin_phi * alpha_y) / (cos_phi + sin_phi);
  704. float invA = safe_sqrtf(alphaO2 * (1 - cos_n) / cos_n);
  705. if (invA < 0.625f) {
  706. return 1.0f;
  707. }
  708. float a = 1.0f / invA;
  709. return ((2.181f * a + 3.535f) * a) / ((2.577f * a + 2.276f) * a + 1.0f);
  710. }
  711. ccl_device float3 bsdf_microfacet_beckmann_eval_reflect(const ShaderClosure *sc,
  712. const float3 I,
  713. const float3 omega_in,
  714. float *pdf)
  715. {
  716. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  717. float alpha_x = bsdf->alpha_x;
  718. float alpha_y = bsdf->alpha_y;
  719. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
  720. float3 N = bsdf->N;
  721. if (m_refractive || alpha_x * alpha_y <= 1e-7f)
  722. return make_float3(0.0f, 0.0f, 0.0f);
  723. float cosNO = dot(N, I);
  724. float cosNI = dot(N, omega_in);
  725. if (cosNO > 0 && cosNI > 0) {
  726. /* get half vector */
  727. float3 m = normalize(omega_in + I);
  728. float alpha2 = alpha_x * alpha_y;
  729. float D, G1o, G1i;
  730. if (alpha_x == alpha_y) {
  731. /* isotropic
  732. * eq. 20: (F*G*D)/(4*in*on)
  733. * eq. 25: first we calculate D(m) */
  734. float cosThetaM = dot(N, m);
  735. float cosThetaM2 = cosThetaM * cosThetaM;
  736. float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
  737. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  738. D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
  739. /* eq. 26, 27: now calculate G1(i,m) and G1(o,m) */
  740. G1o = bsdf_beckmann_G1(alpha_x, cosNO);
  741. G1i = bsdf_beckmann_G1(alpha_x, cosNI);
  742. }
  743. else {
  744. /* anisotropic */
  745. float3 X, Y, Z = N;
  746. make_orthonormals_tangent(Z, bsdf->T, &X, &Y);
  747. /* distribution */
  748. float3 local_m = make_float3(dot(X, m), dot(Y, m), dot(Z, m));
  749. float slope_x = -local_m.x / (local_m.z * alpha_x);
  750. float slope_y = -local_m.y / (local_m.z * alpha_y);
  751. float cosThetaM = local_m.z;
  752. float cosThetaM2 = cosThetaM * cosThetaM;
  753. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  754. D = expf(-slope_x * slope_x - slope_y * slope_y) / (M_PI_F * alpha2 * cosThetaM4);
  755. /* G1(i,m) and G1(o,m) */
  756. G1o = bsdf_beckmann_aniso_G1(alpha_x, alpha_y, cosNO, dot(I, X), dot(I, Y));
  757. G1i = bsdf_beckmann_aniso_G1(alpha_x, alpha_y, cosNI, dot(omega_in, X), dot(omega_in, Y));
  758. }
  759. float G = G1o * G1i;
  760. /* eq. 20 */
  761. float common = D * 0.25f / cosNO;
  762. float out = G * common;
  763. /* eq. 2 in distribution of visible normals sampling
  764. * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
  765. /* eq. 38 - but see also:
  766. * eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
  767. * pdf = pm * 0.25 / dot(m, I); */
  768. *pdf = G1o * common;
  769. return make_float3(out, out, out);
  770. }
  771. return make_float3(0.0f, 0.0f, 0.0f);
  772. }
  773. ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(const ShaderClosure *sc,
  774. const float3 I,
  775. const float3 omega_in,
  776. float *pdf)
  777. {
  778. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  779. float alpha_x = bsdf->alpha_x;
  780. float alpha_y = bsdf->alpha_y;
  781. float m_eta = bsdf->ior;
  782. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
  783. float3 N = bsdf->N;
  784. if (!m_refractive || alpha_x * alpha_y <= 1e-7f)
  785. return make_float3(0.0f, 0.0f, 0.0f);
  786. float cosNO = dot(N, I);
  787. float cosNI = dot(N, omega_in);
  788. if (cosNO <= 0 || cosNI >= 0)
  789. return make_float3(0.0f, 0.0f, 0.0f);
  790. /* compute half-vector of the refraction (eq. 16) */
  791. float3 ht = -(m_eta * omega_in + I);
  792. float3 Ht = normalize(ht);
  793. float cosHO = dot(Ht, I);
  794. float cosHI = dot(Ht, omega_in);
  795. /* eq. 25: first we calculate D(m) with m=Ht: */
  796. float alpha2 = alpha_x * alpha_y;
  797. float cosThetaM = min(dot(N, Ht), 1.0f);
  798. float cosThetaM2 = cosThetaM * cosThetaM;
  799. float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
  800. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  801. float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
  802. /* eq. 26, 27: now calculate G1(i,m) and G1(o,m) */
  803. float G1o = bsdf_beckmann_G1(alpha_x, cosNO);
  804. float G1i = bsdf_beckmann_G1(alpha_x, cosNI);
  805. float G = G1o * G1i;
  806. /* probability */
  807. float Ht2 = dot(ht, ht);
  808. /* eq. 2 in distribution of visible normals sampling
  809. * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
  810. /* out = fabsf(cosHI * cosHO) * (m_eta * m_eta) * G * D / (cosNO * Ht2)
  811. * pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2 */
  812. float common = D * (m_eta * m_eta) / (cosNO * Ht2);
  813. float out = G * fabsf(cosHI * cosHO) * common;
  814. *pdf = G1o * fabsf(cosHO * cosHI) * common;
  815. return make_float3(out, out, out);
  816. }
  817. ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg,
  818. const ShaderClosure *sc,
  819. float3 Ng,
  820. float3 I,
  821. float3 dIdx,
  822. float3 dIdy,
  823. float randu,
  824. float randv,
  825. float3 *eval,
  826. float3 *omega_in,
  827. float3 *domega_in_dx,
  828. float3 *domega_in_dy,
  829. float *pdf)
  830. {
  831. const MicrofacetBsdf *bsdf = (const MicrofacetBsdf *)sc;
  832. float alpha_x = bsdf->alpha_x;
  833. float alpha_y = bsdf->alpha_y;
  834. bool m_refractive = bsdf->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
  835. float3 N = bsdf->N;
  836. int label;
  837. float cosNO = dot(N, I);
  838. if (cosNO > 0) {
  839. float3 X, Y, Z = N;
  840. if (alpha_x == alpha_y)
  841. make_orthonormals(Z, &X, &Y);
  842. else
  843. make_orthonormals_tangent(Z, bsdf->T, &X, &Y);
  844. /* importance sampling with distribution of visible normals. vectors are
  845. * transformed to local space before and after */
  846. float3 local_I = make_float3(dot(X, I), dot(Y, I), cosNO);
  847. float3 local_m;
  848. float G1o;
  849. local_m = microfacet_sample_stretched(kg, local_I, alpha_x, alpha_x, randu, randv, true, &G1o);
  850. float3 m = X * local_m.x + Y * local_m.y + Z * local_m.z;
  851. float cosThetaM = local_m.z;
  852. /* reflection or refraction? */
  853. if (!m_refractive) {
  854. label = LABEL_REFLECT | LABEL_GLOSSY;
  855. float cosMO = dot(m, I);
  856. if (cosMO > 0) {
  857. /* eq. 39 - compute actual reflected direction */
  858. *omega_in = 2 * cosMO * m - I;
  859. if (dot(Ng, *omega_in) > 0) {
  860. if (alpha_x * alpha_y <= 1e-7f) {
  861. /* some high number for MIS */
  862. *pdf = 1e6f;
  863. *eval = make_float3(1e6f, 1e6f, 1e6f);
  864. label = LABEL_REFLECT | LABEL_SINGULAR;
  865. }
  866. else {
  867. /* microfacet normal is visible to this ray
  868. * eq. 25 */
  869. float alpha2 = alpha_x * alpha_y;
  870. float D, G1i;
  871. if (alpha_x == alpha_y) {
  872. /* istropic distribution */
  873. float cosThetaM2 = cosThetaM * cosThetaM;
  874. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  875. float tanThetaM2 = 1 / (cosThetaM2)-1;
  876. D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
  877. /* eval BRDF*cosNI */
  878. float cosNI = dot(N, *omega_in);
  879. /* eq. 26, 27: now calculate G1(i,m) */
  880. G1i = bsdf_beckmann_G1(alpha_x, cosNI);
  881. }
  882. else {
  883. /* anisotropic distribution */
  884. float3 local_m = make_float3(dot(X, m), dot(Y, m), dot(Z, m));
  885. float slope_x = -local_m.x / (local_m.z * alpha_x);
  886. float slope_y = -local_m.y / (local_m.z * alpha_y);
  887. float cosThetaM = local_m.z;
  888. float cosThetaM2 = cosThetaM * cosThetaM;
  889. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  890. D = expf(-slope_x * slope_x - slope_y * slope_y) / (M_PI_F * alpha2 * cosThetaM4);
  891. /* G1(i,m) */
  892. G1i = bsdf_beckmann_aniso_G1(
  893. alpha_x, alpha_y, dot(*omega_in, N), dot(*omega_in, X), dot(*omega_in, Y));
  894. }
  895. float G = G1o * G1i;
  896. /* see eval function for derivation */
  897. float common = D * 0.25f / cosNO;
  898. float out = G * common;
  899. *pdf = G1o * common;
  900. *eval = make_float3(out, out, out);
  901. }
  902. #ifdef __RAY_DIFFERENTIALS__
  903. *domega_in_dx = (2 * dot(m, dIdx)) * m - dIdx;
  904. *domega_in_dy = (2 * dot(m, dIdy)) * m - dIdy;
  905. #endif
  906. }
  907. }
  908. }
  909. else {
  910. label = LABEL_TRANSMIT | LABEL_GLOSSY;
  911. /* CAUTION: the i and o variables are inverted relative to the paper
  912. * eq. 39 - compute actual refractive direction */
  913. float3 R, T;
  914. #ifdef __RAY_DIFFERENTIALS__
  915. float3 dRdx, dRdy, dTdx, dTdy;
  916. #endif
  917. float m_eta = bsdf->ior, fresnel;
  918. bool inside;
  919. fresnel = fresnel_dielectric(m_eta,
  920. m,
  921. I,
  922. &R,
  923. &T,
  924. #ifdef __RAY_DIFFERENTIALS__
  925. dIdx,
  926. dIdy,
  927. &dRdx,
  928. &dRdy,
  929. &dTdx,
  930. &dTdy,
  931. #endif
  932. &inside);
  933. if (!inside && fresnel != 1.0f) {
  934. *omega_in = T;
  935. #ifdef __RAY_DIFFERENTIALS__
  936. *domega_in_dx = dTdx;
  937. *domega_in_dy = dTdy;
  938. #endif
  939. if (alpha_x * alpha_y <= 1e-7f || fabsf(m_eta - 1.0f) < 1e-4f) {
  940. /* some high number for MIS */
  941. *pdf = 1e6f;
  942. *eval = make_float3(1e6f, 1e6f, 1e6f);
  943. label = LABEL_TRANSMIT | LABEL_SINGULAR;
  944. }
  945. else {
  946. /* eq. 33 */
  947. float alpha2 = alpha_x * alpha_y;
  948. float cosThetaM2 = cosThetaM * cosThetaM;
  949. float cosThetaM4 = cosThetaM2 * cosThetaM2;
  950. float tanThetaM2 = 1 / (cosThetaM2)-1;
  951. float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
  952. /* eval BRDF*cosNI */
  953. float cosNI = dot(N, *omega_in);
  954. /* eq. 26, 27: now calculate G1(i,m) */
  955. float G1i = bsdf_beckmann_G1(alpha_x, cosNI);
  956. float G = G1o * G1i;
  957. /* eq. 21 */
  958. float cosHI = dot(m, *omega_in);
  959. float cosHO = dot(m, I);
  960. float Ht2 = m_eta * cosHI + cosHO;
  961. Ht2 *= Ht2;
  962. /* see eval function for derivation */
  963. float common = D * (m_eta * m_eta) / (cosNO * Ht2);
  964. float out = G * fabsf(cosHI * cosHO) * common;
  965. *pdf = G1o * cosHO * fabsf(cosHI) * common;
  966. *eval = make_float3(out, out, out);
  967. }
  968. }
  969. }
  970. }
  971. else {
  972. label = (m_refractive) ? LABEL_TRANSMIT | LABEL_GLOSSY : LABEL_REFLECT | LABEL_GLOSSY;
  973. }
  974. return label;
  975. }
  976. CCL_NAMESPACE_END
  977. #endif /* __BSDF_MICROFACET_H__ */