pbrBlockSubSurface.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. // Do not edit.
  2. import { ShaderStore } from "../../Engines/shaderStore.js";
  3. const name = "pbrBlockSubSurface";
  4. const shader = `struct subSurfaceOutParams
  5. {vec3 specularEnvironmentReflectance;
  6. #ifdef SS_REFRACTION
  7. vec3 finalRefraction;vec3 surfaceAlbedo;
  8. #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
  9. float alpha;
  10. #endif
  11. #ifdef REFLECTION
  12. float refractionFactorForIrradiance;
  13. #endif
  14. #endif
  15. #ifdef SS_TRANSLUCENCY
  16. vec3 transmittance;float translucencyIntensity;
  17. #ifdef REFLECTION
  18. vec3 refractionIrradiance;
  19. #endif
  20. #endif
  21. #if DEBUGMODE>0
  22. #ifdef SS_THICKNESSANDMASK_TEXTURE
  23. vec4 thicknessMap;
  24. #endif
  25. #ifdef SS_REFRACTION
  26. vec4 environmentRefraction;vec3 refractionTransmittance;
  27. #endif
  28. #endif
  29. };
  30. #ifdef SUBSURFACE
  31. #ifdef SS_REFRACTION
  32. #define pbr_inline
  33. #define inline
  34. vec4 sampleEnvironmentRefraction(
  35. in float ior
  36. ,in float thickness
  37. ,in float refractionLOD
  38. ,in vec3 normalW
  39. ,in vec3 vPositionW
  40. ,in vec3 viewDirectionW
  41. ,in mat4 view
  42. ,in vec4 vRefractionInfos
  43. ,in mat4 refractionMatrix
  44. ,in vec4 vRefractionMicrosurfaceInfos
  45. ,in float alphaG
  46. #ifdef SS_REFRACTIONMAP_3D
  47. ,in samplerCube refractionSampler
  48. #ifndef LODBASEDMICROSFURACE
  49. ,in samplerCube refractionSamplerLow
  50. ,in samplerCube refractionSamplerHigh
  51. #endif
  52. #else
  53. ,in sampler2D refractionSampler
  54. #ifndef LODBASEDMICROSFURACE
  55. ,in sampler2D refractionSamplerLow
  56. ,in sampler2D refractionSamplerHigh
  57. #endif
  58. #endif
  59. #ifdef ANISOTROPIC
  60. ,in anisotropicOutParams anisotropicOut
  61. #endif
  62. #ifdef REALTIME_FILTERING
  63. ,in vec2 vRefractionFilteringInfo
  64. #endif
  65. #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
  66. ,in vec3 refractionPosition
  67. ,in vec3 refractionSize
  68. #endif
  69. ) {vec4 environmentRefraction=vec4(0.,0.,0.,0.);
  70. #ifdef ANISOTROPIC
  71. vec3 refractionVector=refract(-viewDirectionW,anisotropicOut.anisotropicNormal,ior);
  72. #else
  73. vec3 refractionVector=refract(-viewDirectionW,normalW,ior);
  74. #endif
  75. #ifdef SS_REFRACTIONMAP_OPPOSITEZ
  76. refractionVector.z*=-1.0;
  77. #endif
  78. #ifdef SS_REFRACTIONMAP_3D
  79. #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
  80. refractionVector=parallaxCorrectNormal(vPositionW,refractionVector,refractionSize,refractionPosition);
  81. #endif
  82. refractionVector.y=refractionVector.y*vRefractionInfos.w;vec3 refractionCoords=refractionVector;refractionCoords=vec3(refractionMatrix*vec4(refractionCoords,0));
  83. #else
  84. #ifdef SS_USE_THICKNESS_AS_DEPTH
  85. vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*thickness,1.0)));
  86. #else
  87. vec3 vRefractionUVW=vec3(refractionMatrix*(view*vec4(vPositionW+refractionVector*vRefractionInfos.z,1.0)));
  88. #endif
  89. vec2 refractionCoords=vRefractionUVW.xy/vRefractionUVW.z;refractionCoords.y=1.0-refractionCoords.y;
  90. #endif
  91. #ifdef LODBASEDMICROSFURACE
  92. refractionLOD=refractionLOD*vRefractionMicrosurfaceInfos.y+vRefractionMicrosurfaceInfos.z;
  93. #ifdef SS_LODINREFRACTIONALPHA
  94. float automaticRefractionLOD=UNPACK_LOD(sampleRefraction(refractionSampler,refractionCoords).a);float requestedRefractionLOD=max(automaticRefractionLOD,refractionLOD);
  95. #else
  96. float requestedRefractionLOD=refractionLOD;
  97. #endif
  98. #if defined(REALTIME_FILTERING) && defined(SS_REFRACTIONMAP_3D)
  99. environmentRefraction=vec4(radiance(alphaG,refractionSampler,refractionCoords,vRefractionFilteringInfo),1.0);
  100. #else
  101. environmentRefraction=sampleRefractionLod(refractionSampler,refractionCoords,requestedRefractionLOD);
  102. #endif
  103. #else
  104. float lodRefractionNormalized=saturate(refractionLOD/log2(vRefractionMicrosurfaceInfos.x));float lodRefractionNormalizedDoubled=lodRefractionNormalized*2.0;vec4 environmentRefractionMid=sampleRefraction(refractionSampler,refractionCoords);if (lodRefractionNormalizedDoubled<1.0){environmentRefraction=mix(
  105. sampleRefraction(refractionSamplerHigh,refractionCoords),
  106. environmentRefractionMid,
  107. lodRefractionNormalizedDoubled
  108. );} else {environmentRefraction=mix(
  109. environmentRefractionMid,
  110. sampleRefraction(refractionSamplerLow,refractionCoords),
  111. lodRefractionNormalizedDoubled-1.0
  112. );}
  113. #endif
  114. #ifdef SS_RGBDREFRACTION
  115. environmentRefraction.rgb=fromRGBD(environmentRefraction);
  116. #endif
  117. #ifdef SS_GAMMAREFRACTION
  118. environmentRefraction.rgb=toLinearSpace(environmentRefraction.rgb);
  119. #endif
  120. return environmentRefraction;}
  121. #endif
  122. #define pbr_inline
  123. #define inline
  124. void subSurfaceBlock(
  125. in vec3 vSubSurfaceIntensity,
  126. in vec2 vThicknessParam,
  127. in vec4 vTintColor,
  128. in vec3 normalW,
  129. in vec3 specularEnvironmentReflectance,
  130. #ifdef SS_THICKNESSANDMASK_TEXTURE
  131. in vec4 thicknessMap,
  132. #endif
  133. #ifdef SS_REFRACTIONINTENSITY_TEXTURE
  134. in vec4 refractionIntensityMap,
  135. #endif
  136. #ifdef SS_TRANSLUCENCYINTENSITY_TEXTURE
  137. in vec4 translucencyIntensityMap,
  138. #endif
  139. #ifdef REFLECTION
  140. #ifdef SS_TRANSLUCENCY
  141. in mat4 reflectionMatrix,
  142. #ifdef USESPHERICALFROMREFLECTIONMAP
  143. #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)
  144. in vec3 irradianceVector_,
  145. #endif
  146. #if defined(REALTIME_FILTERING)
  147. in samplerCube reflectionSampler,
  148. in vec2 vReflectionFilteringInfo,
  149. #endif
  150. #endif
  151. #ifdef USEIRRADIANCEMAP
  152. #ifdef REFLECTIONMAP_3D
  153. in samplerCube irradianceSampler,
  154. #else
  155. in sampler2D irradianceSampler,
  156. #endif
  157. #endif
  158. #endif
  159. #endif
  160. #if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)
  161. in vec3 surfaceAlbedo,
  162. #endif
  163. #ifdef SS_REFRACTION
  164. in vec3 vPositionW,
  165. in vec3 viewDirectionW,
  166. in mat4 view,
  167. in vec4 vRefractionInfos,
  168. in mat4 refractionMatrix,
  169. in vec4 vRefractionMicrosurfaceInfos,
  170. in vec4 vLightingIntensity,
  171. #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
  172. in float alpha,
  173. #endif
  174. #ifdef SS_LODINREFRACTIONALPHA
  175. in float NdotVUnclamped,
  176. #endif
  177. #ifdef SS_LINEARSPECULARREFRACTION
  178. in float roughness,
  179. #endif
  180. in float alphaG,
  181. #ifdef SS_REFRACTIONMAP_3D
  182. in samplerCube refractionSampler,
  183. #ifndef LODBASEDMICROSFURACE
  184. in samplerCube refractionSamplerLow,
  185. in samplerCube refractionSamplerHigh,
  186. #endif
  187. #else
  188. in sampler2D refractionSampler,
  189. #ifndef LODBASEDMICROSFURACE
  190. in sampler2D refractionSamplerLow,
  191. in sampler2D refractionSamplerHigh,
  192. #endif
  193. #endif
  194. #ifdef ANISOTROPIC
  195. in anisotropicOutParams anisotropicOut,
  196. #endif
  197. #ifdef REALTIME_FILTERING
  198. in vec2 vRefractionFilteringInfo,
  199. #endif
  200. #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
  201. in vec3 refractionPosition,
  202. in vec3 refractionSize,
  203. #endif
  204. #ifdef SS_DISPERSION
  205. in float dispersion,
  206. #endif
  207. #endif
  208. #ifdef SS_TRANSLUCENCY
  209. in vec3 vDiffusionDistance,
  210. #endif
  211. out subSurfaceOutParams outParams
  212. )
  213. {outParams.specularEnvironmentReflectance=specularEnvironmentReflectance;
  214. #ifdef SS_REFRACTION
  215. float refractionIntensity=vSubSurfaceIntensity.x;
  216. #ifdef SS_LINKREFRACTIONTOTRANSPARENCY
  217. refractionIntensity*=(1.0-alpha);outParams.alpha=1.0;
  218. #endif
  219. #endif
  220. #ifdef SS_TRANSLUCENCY
  221. float translucencyIntensity=vSubSurfaceIntensity.y;
  222. #endif
  223. #ifdef SS_THICKNESSANDMASK_TEXTURE
  224. #if defined(SS_USE_GLTF_TEXTURES)
  225. float thickness=thicknessMap.g*vThicknessParam.y+vThicknessParam.x;
  226. #else
  227. float thickness=thicknessMap.r*vThicknessParam.y+vThicknessParam.x;
  228. #endif
  229. #if DEBUGMODE>0
  230. outParams.thicknessMap=thicknessMap;
  231. #endif
  232. #if defined(SS_REFRACTION) && defined(SS_REFRACTION_USE_INTENSITY_FROM_THICKNESS)
  233. #if defined(SS_USE_GLTF_TEXTURES)
  234. refractionIntensity*=thicknessMap.r;
  235. #else
  236. refractionIntensity*=thicknessMap.g;
  237. #endif
  238. #endif
  239. #if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCY_USE_INTENSITY_FROM_THICKNESS)
  240. translucencyIntensity*=thicknessMap.b;
  241. #endif
  242. #else
  243. float thickness=vThicknessParam.y;
  244. #endif
  245. #if defined(SS_REFRACTION) && defined(SS_REFRACTIONINTENSITY_TEXTURE)
  246. #ifdef SS_USE_GLTF_TEXTURES
  247. refractionIntensity*=refractionIntensityMap.r;
  248. #else
  249. refractionIntensity*=refractionIntensityMap.g;
  250. #endif
  251. #endif
  252. #if defined(SS_TRANSLUCENCY) && defined(SS_TRANSLUCENCYINTENSITY_TEXTURE)
  253. translucencyIntensity*=translucencyIntensityMap.b;
  254. #endif
  255. #ifdef SS_TRANSLUCENCY
  256. thickness=maxEps(thickness);vec3 transmittance=transmittanceBRDF_Burley(vTintColor.rgb,vDiffusionDistance,thickness);transmittance*=translucencyIntensity;outParams.transmittance=transmittance;outParams.translucencyIntensity=translucencyIntensity;
  257. #endif
  258. #ifdef SS_REFRACTION
  259. vec4 environmentRefraction=vec4(0.,0.,0.,0.);
  260. #ifdef SS_HAS_THICKNESS
  261. float ior=vRefractionInfos.y;
  262. #else
  263. float ior=vRefractionMicrosurfaceInfos.w;
  264. #endif
  265. #ifdef SS_LODINREFRACTIONALPHA
  266. float refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG,NdotVUnclamped);
  267. #elif defined(SS_LINEARSPECULARREFRACTION)
  268. float refractionRoughness=alphaG;refractionRoughness=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLinearLodFromRoughness(vRefractionMicrosurfaceInfos.x,refractionRoughness);
  269. #else
  270. float refractionAlphaG=alphaG;refractionAlphaG=mix(alphaG,0.0,clamp(ior*3.0-2.0,0.0,1.0));float refractionLOD=getLodFromAlphaG(vRefractionMicrosurfaceInfos.x,refractionAlphaG);
  271. #endif
  272. float refraction_ior=vRefractionInfos.y;
  273. #ifdef SS_DISPERSION
  274. float realIOR=1.0/refraction_ior;float iorDispersionSpread=0.04*dispersion*(realIOR-1.0);vec3 iors=vec3(1.0/(realIOR-iorDispersionSpread),refraction_ior,1.0/(realIOR+iorDispersionSpread));for (int i=0; i<3; i++) {refraction_ior=iors[i];
  275. #endif
  276. vec4 envSample=sampleEnvironmentRefraction(refraction_ior,thickness,refractionLOD,normalW,vPositionW,viewDirectionW,view,vRefractionInfos,refractionMatrix,vRefractionMicrosurfaceInfos,alphaG
  277. #ifdef SS_REFRACTIONMAP_3D
  278. ,refractionSampler
  279. #ifndef LODBASEDMICROSFURACE
  280. ,refractionSamplerLow
  281. ,refractionSamplerHigh
  282. #endif
  283. #else
  284. ,refractionSampler
  285. #ifndef LODBASEDMICROSFURACE
  286. ,refractionSamplerLow
  287. ,refractionSamplerHigh
  288. #endif
  289. #endif
  290. #ifdef ANISOTROPIC
  291. ,anisotropicOut
  292. #endif
  293. #ifdef REALTIME_FILTERING
  294. ,vRefractionFilteringInfo
  295. #endif
  296. #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC
  297. ,refractionPosition
  298. ,refractionSize
  299. #endif
  300. );
  301. #ifdef SS_DISPERSION
  302. environmentRefraction[i]=envSample[i];}
  303. #else
  304. environmentRefraction=envSample;
  305. #endif
  306. environmentRefraction.rgb*=vRefractionInfos.x;
  307. #endif
  308. #ifdef SS_REFRACTION
  309. vec3 refractionTransmittance=vec3(refractionIntensity);
  310. #ifdef SS_THICKNESSANDMASK_TEXTURE
  311. vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,thickness);
  312. #elif defined(SS_LINKREFRACTIONTOTRANSPARENCY)
  313. float maxChannel=max(max(surfaceAlbedo.r,surfaceAlbedo.g),surfaceAlbedo.b);vec3 volumeAlbedo=saturate(maxChannel*surfaceAlbedo);environmentRefraction.rgb*=volumeAlbedo;
  314. #else
  315. vec3 volumeAlbedo=computeColorAtDistanceInMedia(vTintColor.rgb,vTintColor.w);refractionTransmittance*=cocaLambert(volumeAlbedo,vThicknessParam.y);
  316. #endif
  317. #ifdef SS_ALBEDOFORREFRACTIONTINT
  318. environmentRefraction.rgb*=surfaceAlbedo.rgb;
  319. #endif
  320. outParams.surfaceAlbedo=surfaceAlbedo*(1.-refractionIntensity);
  321. #ifdef REFLECTION
  322. outParams.refractionFactorForIrradiance=(1.-refractionIntensity);
  323. #endif
  324. #ifdef UNUSED_MULTIPLEBOUNCES
  325. vec3 bounceSpecularEnvironmentReflectance=(2.0*specularEnvironmentReflectance)/(1.0+specularEnvironmentReflectance);outParams.specularEnvironmentReflectance=mix(bounceSpecularEnvironmentReflectance,specularEnvironmentReflectance,refractionIntensity);
  326. #endif
  327. refractionTransmittance*=1.0-outParams.specularEnvironmentReflectance;
  328. #if DEBUGMODE>0
  329. outParams.refractionTransmittance=refractionTransmittance;
  330. #endif
  331. outParams.finalRefraction=environmentRefraction.rgb*refractionTransmittance*vLightingIntensity.z;
  332. #if DEBUGMODE>0
  333. outParams.environmentRefraction=environmentRefraction;
  334. #endif
  335. #endif
  336. #if defined(REFLECTION) && defined(SS_TRANSLUCENCY)
  337. #if defined(NORMAL) && defined(USESPHERICALINVERTEX) || !defined(USESPHERICALFROMREFLECTIONMAP)
  338. vec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;
  339. #ifdef REFLECTIONMAP_OPPOSITEZ
  340. irradianceVector.z*=-1.0;
  341. #endif
  342. #ifdef INVERTCUBICMAP
  343. irradianceVector.y*=-1.0;
  344. #endif
  345. #else
  346. vec3 irradianceVector=irradianceVector_;
  347. #endif
  348. #if defined(USESPHERICALFROMREFLECTIONMAP)
  349. #if defined(REALTIME_FILTERING)
  350. vec3 refractionIrradiance=irradiance(reflectionSampler,-irradianceVector,vReflectionFilteringInfo);
  351. #else
  352. vec3 refractionIrradiance=computeEnvironmentIrradiance(-irradianceVector);
  353. #endif
  354. #elif defined(USEIRRADIANCEMAP)
  355. #ifdef REFLECTIONMAP_3D
  356. vec3 irradianceCoords=irradianceVector;
  357. #else
  358. vec2 irradianceCoords=irradianceVector.xy;
  359. #ifdef REFLECTIONMAP_PROJECTION
  360. irradianceCoords/=irradianceVector.z;
  361. #endif
  362. irradianceCoords.y=1.0-irradianceCoords.y;
  363. #endif
  364. vec4 refractionIrradiance=sampleReflection(irradianceSampler,-irradianceCoords);
  365. #ifdef RGBDREFLECTION
  366. refractionIrradiance.rgb=fromRGBD(refractionIrradiance);
  367. #endif
  368. #ifdef GAMMAREFLECTION
  369. refractionIrradiance.rgb=toLinearSpace(refractionIrradiance.rgb);
  370. #endif
  371. #else
  372. vec4 refractionIrradiance=vec4(0.);
  373. #endif
  374. refractionIrradiance.rgb*=transmittance;
  375. #ifdef SS_ALBEDOFORTRANSLUCENCYTINT
  376. refractionIrradiance.rgb*=surfaceAlbedo.rgb;
  377. #endif
  378. outParams.refractionIrradiance=refractionIrradiance.rgb;
  379. #endif
  380. }
  381. #endif
  382. `;
  383. // Sideeffect
  384. ShaderStore.IncludesShadersStore[name] = shader;
  385. /** @internal */
  386. export const pbrBlockSubSurface = { name, shader };
  387. //# sourceMappingURL=pbrBlockSubSurface.js.map