bsdf.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. /*
  2. * Copyright 2011-2013 Blender Foundation
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "kernel/closure/bsdf_ashikhmin_velvet.h"
  17. #include "kernel/closure/bsdf_diffuse.h"
  18. #include "kernel/closure/bsdf_oren_nayar.h"
  19. #include "kernel/closure/bsdf_phong_ramp.h"
  20. #include "kernel/closure/bsdf_diffuse_ramp.h"
  21. #include "kernel/closure/bsdf_microfacet.h"
  22. #include "kernel/closure/bsdf_microfacet_multi.h"
  23. #include "kernel/closure/bsdf_reflection.h"
  24. #include "kernel/closure/bsdf_refraction.h"
  25. #include "kernel/closure/bsdf_transparent.h"
  26. #include "kernel/closure/bsdf_ashikhmin_shirley.h"
  27. #include "kernel/closure/bsdf_toon.h"
  28. #include "kernel/closure/bsdf_hair.h"
  29. #include "kernel/closure/bsdf_hair_principled.h"
  30. #include "kernel/closure/bsdf_principled_diffuse.h"
  31. #include "kernel/closure/bsdf_principled_sheen.h"
  32. #include "kernel/closure/bssrdf.h"
  33. #include "kernel/closure/volume.h"
  34. CCL_NAMESPACE_BEGIN
  35. /* Returns the square of the roughness of the closure if it has roughness,
  36. * 0 for singular closures and 1 otherwise. */
  37. ccl_device_inline float bsdf_get_specular_roughness_squared(const ShaderClosure *sc)
  38. {
  39. if (CLOSURE_IS_BSDF_SINGULAR(sc->type)) {
  40. return 0.0f;
  41. }
  42. if (CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
  43. MicrofacetBsdf *bsdf = (MicrofacetBsdf *)sc;
  44. return bsdf->alpha_x * bsdf->alpha_y;
  45. }
  46. return 1.0f;
  47. }
  48. ccl_device_inline float bsdf_get_roughness_squared(const ShaderClosure *sc)
  49. {
  50. /* This version includes diffuse, mainly for baking Principled BSDF
  51. * where specular and metallic zero otherwise does not bake the
  52. * specified roughness parameter. */
  53. if (sc->type == CLOSURE_BSDF_OREN_NAYAR_ID) {
  54. OrenNayarBsdf *bsdf = (OrenNayarBsdf *)sc;
  55. return sqr(sqr(bsdf->roughness));
  56. }
  57. if (sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) {
  58. PrincipledDiffuseBsdf *bsdf = (PrincipledDiffuseBsdf *)sc;
  59. return sqr(sqr(bsdf->roughness));
  60. }
  61. if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
  62. return 0.0f;
  63. }
  64. return bsdf_get_specular_roughness_squared(sc);
  65. }
  66. ccl_device_inline int bsdf_sample(KernelGlobals *kg,
  67. ShaderData *sd,
  68. const ShaderClosure *sc,
  69. float randu,
  70. float randv,
  71. float3 *eval,
  72. float3 *omega_in,
  73. differential3 *domega_in,
  74. float *pdf)
  75. {
  76. int label;
  77. switch (sc->type) {
  78. case CLOSURE_BSDF_DIFFUSE_ID:
  79. case CLOSURE_BSDF_BSSRDF_ID:
  80. label = bsdf_diffuse_sample(sc,
  81. sd->Ng,
  82. sd->I,
  83. sd->dI.dx,
  84. sd->dI.dy,
  85. randu,
  86. randv,
  87. eval,
  88. omega_in,
  89. &domega_in->dx,
  90. &domega_in->dy,
  91. pdf);
  92. break;
  93. #ifdef __SVM__
  94. case CLOSURE_BSDF_OREN_NAYAR_ID:
  95. label = bsdf_oren_nayar_sample(sc,
  96. sd->Ng,
  97. sd->I,
  98. sd->dI.dx,
  99. sd->dI.dy,
  100. randu,
  101. randv,
  102. eval,
  103. omega_in,
  104. &domega_in->dx,
  105. &domega_in->dy,
  106. pdf);
  107. break;
  108. # ifdef __OSL__
  109. case CLOSURE_BSDF_PHONG_RAMP_ID:
  110. label = bsdf_phong_ramp_sample(sc,
  111. sd->Ng,
  112. sd->I,
  113. sd->dI.dx,
  114. sd->dI.dy,
  115. randu,
  116. randv,
  117. eval,
  118. omega_in,
  119. &domega_in->dx,
  120. &domega_in->dy,
  121. pdf);
  122. break;
  123. case CLOSURE_BSDF_DIFFUSE_RAMP_ID:
  124. label = bsdf_diffuse_ramp_sample(sc,
  125. sd->Ng,
  126. sd->I,
  127. sd->dI.dx,
  128. sd->dI.dy,
  129. randu,
  130. randv,
  131. eval,
  132. omega_in,
  133. &domega_in->dx,
  134. &domega_in->dy,
  135. pdf);
  136. break;
  137. # endif
  138. case CLOSURE_BSDF_TRANSLUCENT_ID:
  139. label = bsdf_translucent_sample(sc,
  140. sd->Ng,
  141. sd->I,
  142. sd->dI.dx,
  143. sd->dI.dy,
  144. randu,
  145. randv,
  146. eval,
  147. omega_in,
  148. &domega_in->dx,
  149. &domega_in->dy,
  150. pdf);
  151. break;
  152. case CLOSURE_BSDF_REFLECTION_ID:
  153. label = bsdf_reflection_sample(sc,
  154. sd->Ng,
  155. sd->I,
  156. sd->dI.dx,
  157. sd->dI.dy,
  158. randu,
  159. randv,
  160. eval,
  161. omega_in,
  162. &domega_in->dx,
  163. &domega_in->dy,
  164. pdf);
  165. break;
  166. case CLOSURE_BSDF_REFRACTION_ID:
  167. label = bsdf_refraction_sample(sc,
  168. sd->Ng,
  169. sd->I,
  170. sd->dI.dx,
  171. sd->dI.dy,
  172. randu,
  173. randv,
  174. eval,
  175. omega_in,
  176. &domega_in->dx,
  177. &domega_in->dy,
  178. pdf);
  179. break;
  180. case CLOSURE_BSDF_TRANSPARENT_ID:
  181. label = bsdf_transparent_sample(sc,
  182. sd->Ng,
  183. sd->I,
  184. sd->dI.dx,
  185. sd->dI.dy,
  186. randu,
  187. randv,
  188. eval,
  189. omega_in,
  190. &domega_in->dx,
  191. &domega_in->dy,
  192. pdf);
  193. break;
  194. case CLOSURE_BSDF_MICROFACET_GGX_ID:
  195. case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
  196. case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
  197. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
  198. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID:
  199. case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
  200. label = bsdf_microfacet_ggx_sample(kg,
  201. sc,
  202. sd->Ng,
  203. sd->I,
  204. sd->dI.dx,
  205. sd->dI.dy,
  206. randu,
  207. randv,
  208. eval,
  209. omega_in,
  210. &domega_in->dx,
  211. &domega_in->dy,
  212. pdf);
  213. break;
  214. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
  215. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
  216. label = bsdf_microfacet_multi_ggx_sample(kg,
  217. sc,
  218. sd->Ng,
  219. sd->I,
  220. sd->dI.dx,
  221. sd->dI.dy,
  222. randu,
  223. randv,
  224. eval,
  225. omega_in,
  226. &domega_in->dx,
  227. &domega_in->dy,
  228. pdf,
  229. &sd->lcg_state);
  230. break;
  231. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
  232. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
  233. label = bsdf_microfacet_multi_ggx_glass_sample(kg,
  234. sc,
  235. sd->Ng,
  236. sd->I,
  237. sd->dI.dx,
  238. sd->dI.dy,
  239. randu,
  240. randv,
  241. eval,
  242. omega_in,
  243. &domega_in->dx,
  244. &domega_in->dy,
  245. pdf,
  246. &sd->lcg_state);
  247. break;
  248. case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
  249. case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
  250. case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
  251. label = bsdf_microfacet_beckmann_sample(kg,
  252. sc,
  253. sd->Ng,
  254. sd->I,
  255. sd->dI.dx,
  256. sd->dI.dy,
  257. randu,
  258. randv,
  259. eval,
  260. omega_in,
  261. &domega_in->dx,
  262. &domega_in->dy,
  263. pdf);
  264. break;
  265. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
  266. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
  267. label = bsdf_ashikhmin_shirley_sample(sc,
  268. sd->Ng,
  269. sd->I,
  270. sd->dI.dx,
  271. sd->dI.dy,
  272. randu,
  273. randv,
  274. eval,
  275. omega_in,
  276. &domega_in->dx,
  277. &domega_in->dy,
  278. pdf);
  279. break;
  280. case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
  281. label = bsdf_ashikhmin_velvet_sample(sc,
  282. sd->Ng,
  283. sd->I,
  284. sd->dI.dx,
  285. sd->dI.dy,
  286. randu,
  287. randv,
  288. eval,
  289. omega_in,
  290. &domega_in->dx,
  291. &domega_in->dy,
  292. pdf);
  293. break;
  294. case CLOSURE_BSDF_DIFFUSE_TOON_ID:
  295. label = bsdf_diffuse_toon_sample(sc,
  296. sd->Ng,
  297. sd->I,
  298. sd->dI.dx,
  299. sd->dI.dy,
  300. randu,
  301. randv,
  302. eval,
  303. omega_in,
  304. &domega_in->dx,
  305. &domega_in->dy,
  306. pdf);
  307. break;
  308. case CLOSURE_BSDF_GLOSSY_TOON_ID:
  309. label = bsdf_glossy_toon_sample(sc,
  310. sd->Ng,
  311. sd->I,
  312. sd->dI.dx,
  313. sd->dI.dy,
  314. randu,
  315. randv,
  316. eval,
  317. omega_in,
  318. &domega_in->dx,
  319. &domega_in->dy,
  320. pdf);
  321. break;
  322. case CLOSURE_BSDF_HAIR_REFLECTION_ID:
  323. label = bsdf_hair_reflection_sample(sc,
  324. sd->Ng,
  325. sd->I,
  326. sd->dI.dx,
  327. sd->dI.dy,
  328. randu,
  329. randv,
  330. eval,
  331. omega_in,
  332. &domega_in->dx,
  333. &domega_in->dy,
  334. pdf);
  335. break;
  336. case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
  337. label = bsdf_hair_transmission_sample(sc,
  338. sd->Ng,
  339. sd->I,
  340. sd->dI.dx,
  341. sd->dI.dy,
  342. randu,
  343. randv,
  344. eval,
  345. omega_in,
  346. &domega_in->dx,
  347. &domega_in->dy,
  348. pdf);
  349. break;
  350. case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
  351. label = bsdf_principled_hair_sample(
  352. kg, sc, sd, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
  353. break;
  354. # ifdef __PRINCIPLED__
  355. case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
  356. case CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID:
  357. label = bsdf_principled_diffuse_sample(sc,
  358. sd->Ng,
  359. sd->I,
  360. sd->dI.dx,
  361. sd->dI.dy,
  362. randu,
  363. randv,
  364. eval,
  365. omega_in,
  366. &domega_in->dx,
  367. &domega_in->dy,
  368. pdf);
  369. break;
  370. case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
  371. label = bsdf_principled_sheen_sample(sc,
  372. sd->Ng,
  373. sd->I,
  374. sd->dI.dx,
  375. sd->dI.dy,
  376. randu,
  377. randv,
  378. eval,
  379. omega_in,
  380. &domega_in->dx,
  381. &domega_in->dy,
  382. pdf);
  383. break;
  384. # endif /* __PRINCIPLED__ */
  385. #endif
  386. #ifdef __VOLUME__
  387. case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
  388. label = volume_henyey_greenstein_sample(sc,
  389. sd->I,
  390. sd->dI.dx,
  391. sd->dI.dy,
  392. randu,
  393. randv,
  394. eval,
  395. omega_in,
  396. &domega_in->dx,
  397. &domega_in->dy,
  398. pdf);
  399. break;
  400. #endif
  401. default:
  402. label = LABEL_NONE;
  403. break;
  404. }
  405. /* Test if BSDF sample should be treated as transparent for background. */
  406. if (label & LABEL_TRANSMIT) {
  407. float threshold_squared = kernel_data.background.transparent_roughness_squared_threshold;
  408. if (threshold_squared >= 0.0f) {
  409. if (bsdf_get_specular_roughness_squared(sc) <= threshold_squared) {
  410. label |= LABEL_TRANSMIT_TRANSPARENT;
  411. }
  412. }
  413. }
  414. return label;
  415. }
  416. #ifndef __KERNEL_CUDA__
  417. ccl_device
  418. #else
  419. ccl_device_inline
  420. #endif
  421. float3
  422. bsdf_eval(KernelGlobals *kg,
  423. ShaderData *sd,
  424. const ShaderClosure *sc,
  425. const float3 omega_in,
  426. float *pdf)
  427. {
  428. float3 eval;
  429. if (dot(sd->Ng, omega_in) >= 0.0f) {
  430. switch (sc->type) {
  431. case CLOSURE_BSDF_DIFFUSE_ID:
  432. case CLOSURE_BSDF_BSSRDF_ID:
  433. eval = bsdf_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
  434. break;
  435. #ifdef __SVM__
  436. case CLOSURE_BSDF_OREN_NAYAR_ID:
  437. eval = bsdf_oren_nayar_eval_reflect(sc, sd->I, omega_in, pdf);
  438. break;
  439. # ifdef __OSL__
  440. case CLOSURE_BSDF_PHONG_RAMP_ID:
  441. eval = bsdf_phong_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
  442. break;
  443. case CLOSURE_BSDF_DIFFUSE_RAMP_ID:
  444. eval = bsdf_diffuse_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
  445. break;
  446. # endif
  447. case CLOSURE_BSDF_TRANSLUCENT_ID:
  448. eval = bsdf_translucent_eval_reflect(sc, sd->I, omega_in, pdf);
  449. break;
  450. case CLOSURE_BSDF_REFLECTION_ID:
  451. eval = bsdf_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
  452. break;
  453. case CLOSURE_BSDF_REFRACTION_ID:
  454. eval = bsdf_refraction_eval_reflect(sc, sd->I, omega_in, pdf);
  455. break;
  456. case CLOSURE_BSDF_TRANSPARENT_ID:
  457. eval = bsdf_transparent_eval_reflect(sc, sd->I, omega_in, pdf);
  458. break;
  459. case CLOSURE_BSDF_MICROFACET_GGX_ID:
  460. case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
  461. case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
  462. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
  463. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID:
  464. case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
  465. eval = bsdf_microfacet_ggx_eval_reflect(sc, sd->I, omega_in, pdf);
  466. break;
  467. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
  468. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
  469. eval = bsdf_microfacet_multi_ggx_eval_reflect(sc, sd->I, omega_in, pdf, &sd->lcg_state);
  470. break;
  471. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
  472. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
  473. eval = bsdf_microfacet_multi_ggx_glass_eval_reflect(
  474. sc, sd->I, omega_in, pdf, &sd->lcg_state);
  475. break;
  476. case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
  477. case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
  478. case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
  479. eval = bsdf_microfacet_beckmann_eval_reflect(sc, sd->I, omega_in, pdf);
  480. break;
  481. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
  482. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
  483. eval = bsdf_ashikhmin_shirley_eval_reflect(sc, sd->I, omega_in, pdf);
  484. break;
  485. case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
  486. eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf);
  487. break;
  488. case CLOSURE_BSDF_DIFFUSE_TOON_ID:
  489. eval = bsdf_diffuse_toon_eval_reflect(sc, sd->I, omega_in, pdf);
  490. break;
  491. case CLOSURE_BSDF_GLOSSY_TOON_ID:
  492. eval = bsdf_glossy_toon_eval_reflect(sc, sd->I, omega_in, pdf);
  493. break;
  494. case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
  495. eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
  496. break;
  497. case CLOSURE_BSDF_HAIR_REFLECTION_ID:
  498. eval = bsdf_hair_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
  499. break;
  500. case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
  501. eval = bsdf_hair_transmission_eval_reflect(sc, sd->I, omega_in, pdf);
  502. break;
  503. # ifdef __PRINCIPLED__
  504. case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
  505. case CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID:
  506. eval = bsdf_principled_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
  507. break;
  508. case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
  509. eval = bsdf_principled_sheen_eval_reflect(sc, sd->I, omega_in, pdf);
  510. break;
  511. # endif /* __PRINCIPLED__ */
  512. #endif
  513. #ifdef __VOLUME__
  514. case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
  515. eval = volume_henyey_greenstein_eval_phase(sc, sd->I, omega_in, pdf);
  516. break;
  517. #endif
  518. default:
  519. eval = make_float3(0.0f, 0.0f, 0.0f);
  520. break;
  521. }
  522. }
  523. else {
  524. switch (sc->type) {
  525. case CLOSURE_BSDF_DIFFUSE_ID:
  526. case CLOSURE_BSDF_BSSRDF_ID:
  527. eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
  528. break;
  529. #ifdef __SVM__
  530. case CLOSURE_BSDF_OREN_NAYAR_ID:
  531. eval = bsdf_oren_nayar_eval_transmit(sc, sd->I, omega_in, pdf);
  532. break;
  533. case CLOSURE_BSDF_TRANSLUCENT_ID:
  534. eval = bsdf_translucent_eval_transmit(sc, sd->I, omega_in, pdf);
  535. break;
  536. case CLOSURE_BSDF_REFLECTION_ID:
  537. eval = bsdf_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
  538. break;
  539. case CLOSURE_BSDF_REFRACTION_ID:
  540. eval = bsdf_refraction_eval_transmit(sc, sd->I, omega_in, pdf);
  541. break;
  542. case CLOSURE_BSDF_TRANSPARENT_ID:
  543. eval = bsdf_transparent_eval_transmit(sc, sd->I, omega_in, pdf);
  544. break;
  545. case CLOSURE_BSDF_MICROFACET_GGX_ID:
  546. case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
  547. case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
  548. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
  549. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID:
  550. case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
  551. eval = bsdf_microfacet_ggx_eval_transmit(sc, sd->I, omega_in, pdf);
  552. break;
  553. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
  554. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
  555. eval = bsdf_microfacet_multi_ggx_eval_transmit(sc, sd->I, omega_in, pdf, &sd->lcg_state);
  556. break;
  557. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
  558. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
  559. eval = bsdf_microfacet_multi_ggx_glass_eval_transmit(
  560. sc, sd->I, omega_in, pdf, &sd->lcg_state);
  561. break;
  562. case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
  563. case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
  564. case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
  565. eval = bsdf_microfacet_beckmann_eval_transmit(sc, sd->I, omega_in, pdf);
  566. break;
  567. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
  568. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
  569. eval = bsdf_ashikhmin_shirley_eval_transmit(sc, sd->I, omega_in, pdf);
  570. break;
  571. case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
  572. eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf);
  573. break;
  574. case CLOSURE_BSDF_DIFFUSE_TOON_ID:
  575. eval = bsdf_diffuse_toon_eval_transmit(sc, sd->I, omega_in, pdf);
  576. break;
  577. case CLOSURE_BSDF_GLOSSY_TOON_ID:
  578. eval = bsdf_glossy_toon_eval_transmit(sc, sd->I, omega_in, pdf);
  579. break;
  580. case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
  581. eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
  582. break;
  583. case CLOSURE_BSDF_HAIR_REFLECTION_ID:
  584. eval = bsdf_hair_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
  585. break;
  586. case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
  587. eval = bsdf_hair_transmission_eval_transmit(sc, sd->I, omega_in, pdf);
  588. break;
  589. # ifdef __PRINCIPLED__
  590. case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
  591. case CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID:
  592. eval = bsdf_principled_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
  593. break;
  594. case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
  595. eval = bsdf_principled_sheen_eval_transmit(sc, sd->I, omega_in, pdf);
  596. break;
  597. # endif /* __PRINCIPLED__ */
  598. #endif
  599. #ifdef __VOLUME__
  600. case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
  601. eval = volume_henyey_greenstein_eval_phase(sc, sd->I, omega_in, pdf);
  602. break;
  603. #endif
  604. default:
  605. eval = make_float3(0.0f, 0.0f, 0.0f);
  606. break;
  607. }
  608. }
  609. return eval;
  610. }
  611. ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness)
  612. {
  613. /* ToDo: do we want to blur volume closures? */
  614. #ifdef __SVM__
  615. switch (sc->type) {
  616. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
  617. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
  618. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
  619. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
  620. bsdf_microfacet_multi_ggx_blur(sc, roughness);
  621. break;
  622. case CLOSURE_BSDF_MICROFACET_GGX_ID:
  623. case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
  624. case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
  625. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
  626. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID:
  627. case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
  628. bsdf_microfacet_ggx_blur(sc, roughness);
  629. break;
  630. case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
  631. case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
  632. case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
  633. bsdf_microfacet_beckmann_blur(sc, roughness);
  634. break;
  635. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
  636. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
  637. bsdf_ashikhmin_shirley_blur(sc, roughness);
  638. break;
  639. case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
  640. bsdf_principled_hair_blur(sc, roughness);
  641. break;
  642. default:
  643. break;
  644. }
  645. #endif
  646. }
  647. ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
  648. {
  649. #ifdef __SVM__
  650. switch (a->type) {
  651. case CLOSURE_BSDF_TRANSPARENT_ID:
  652. return true;
  653. case CLOSURE_BSDF_DIFFUSE_ID:
  654. case CLOSURE_BSDF_BSSRDF_ID:
  655. case CLOSURE_BSDF_TRANSLUCENT_ID:
  656. return bsdf_diffuse_merge(a, b);
  657. case CLOSURE_BSDF_OREN_NAYAR_ID:
  658. return bsdf_oren_nayar_merge(a, b);
  659. case CLOSURE_BSDF_REFLECTION_ID:
  660. case CLOSURE_BSDF_REFRACTION_ID:
  661. case CLOSURE_BSDF_MICROFACET_GGX_ID:
  662. case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
  663. case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
  664. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_ID:
  665. case CLOSURE_BSDF_MICROFACET_GGX_ANISO_FRESNEL_ID:
  666. case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
  667. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID:
  668. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
  669. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
  670. case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
  671. case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
  672. case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
  673. case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
  674. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID:
  675. case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ANISO_ID:
  676. return bsdf_microfacet_merge(a, b);
  677. case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
  678. return bsdf_ashikhmin_velvet_merge(a, b);
  679. case CLOSURE_BSDF_DIFFUSE_TOON_ID:
  680. case CLOSURE_BSDF_GLOSSY_TOON_ID:
  681. return bsdf_toon_merge(a, b);
  682. case CLOSURE_BSDF_HAIR_REFLECTION_ID:
  683. case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
  684. return bsdf_hair_merge(a, b);
  685. # ifdef __PRINCIPLED__
  686. case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
  687. case CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID:
  688. return bsdf_principled_diffuse_merge(a, b);
  689. # endif
  690. # ifdef __VOLUME__
  691. case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
  692. return volume_henyey_greenstein_merge(a, b);
  693. # endif
  694. default:
  695. return false;
  696. }
  697. #else
  698. return false;
  699. #endif
  700. }
  701. CCL_NAMESPACE_END