pbr.fragment.fx 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280
  1. #ifdef BUMP
  2. #extension GL_OES_standard_derivatives : enable
  3. #endif
  4. #ifdef LOGARITHMICDEPTH
  5. #extension GL_EXT_frag_depth : enable
  6. #endif
  7. precision highp float;
  8. // Constants
  9. #define RECIPROCAL_PI2 0.15915494
  10. #define FRESNEL_MAXIMUM_ON_ROUGH 0.25
  11. uniform vec3 vEyePosition;
  12. uniform vec3 vAmbientColor;
  13. uniform vec3 vReflectionColor;
  14. uniform vec4 vAlbedoColor;
  15. // CUSTOM CONTROLS
  16. uniform vec4 vLightingIntensity;
  17. uniform vec4 vCameraInfos;
  18. #ifdef OVERLOADEDVALUES
  19. uniform vec4 vOverloadedIntensity;
  20. uniform vec3 vOverloadedAmbient;
  21. uniform vec3 vOverloadedAlbedo;
  22. uniform vec3 vOverloadedReflectivity;
  23. uniform vec3 vOverloadedEmissive;
  24. uniform vec3 vOverloadedReflection;
  25. uniform vec3 vOverloadedMicroSurface;
  26. #endif
  27. #ifdef OVERLOADEDSHADOWVALUES
  28. uniform vec4 vOverloadedShadowIntensity;
  29. #endif
  30. // PBR CUSTOM CONSTANTS
  31. const float kPi = 3.1415926535897932384626433832795;
  32. // PBR HELPER METHODS
  33. float Square(float value)
  34. {
  35. return value * value;
  36. }
  37. float getLuminance(vec3 color)
  38. {
  39. return clamp(dot(color, vec3(0.2126, 0.7152, 0.0722)), 0., 1.);
  40. }
  41. float convertRoughnessToAverageSlope(float roughness)
  42. {
  43. // Calculate AlphaG as square of roughness; add epsilon to avoid numerical issues
  44. const float kMinimumVariance = 0.0005;
  45. float alphaG = Square(roughness) + kMinimumVariance;
  46. return alphaG;
  47. }
  48. // From Microfacet Models for Refraction through Rough Surfaces, Walter et al. 2007
  49. float smithVisibilityG1_TrowbridgeReitzGGX(float dot, float alphaG)
  50. {
  51. float tanSquared = (1.0 - dot * dot) / (dot * dot);
  52. return 2.0 / (1.0 + sqrt(1.0 + alphaG * alphaG * tanSquared));
  53. }
  54. float smithVisibilityG_TrowbridgeReitzGGX_Walter(float NdotL, float NdotV, float alphaG)
  55. {
  56. return smithVisibilityG1_TrowbridgeReitzGGX(NdotL, alphaG) * smithVisibilityG1_TrowbridgeReitzGGX(NdotV, alphaG);
  57. }
  58. // Trowbridge-Reitz (GGX)
  59. // Generalised Trowbridge-Reitz with gamma power=2.0
  60. float normalDistributionFunction_TrowbridgeReitzGGX(float NdotH, float alphaG)
  61. {
  62. // Note: alphaG is average slope (gradient) of the normals in slope-space.
  63. // It is also the (trigonometric) tangent of the median distribution value, i.e. 50% of normals have
  64. // a tangent (gradient) closer to the macrosurface than this slope.
  65. float a2 = Square(alphaG);
  66. float d = NdotH * NdotH * (a2 - 1.0) + 1.0;
  67. return a2 / (kPi * d * d);
  68. }
  69. vec3 fresnelSchlickGGX(float VdotH, vec3 reflectance0, vec3 reflectance90)
  70. {
  71. return reflectance0 + (reflectance90 - reflectance0) * pow(clamp(1.0 - VdotH, 0., 1.), 5.0);
  72. }
  73. vec3 FresnelSchlickEnvironmentGGX(float VdotN, vec3 reflectance0, vec3 reflectance90, float smoothness)
  74. {
  75. // Schlick fresnel approximation, extended with basic smoothness term so that rough surfaces do not approach reflectance90 at grazing angle
  76. float weight = mix(FRESNEL_MAXIMUM_ON_ROUGH, 1.0, smoothness);
  77. return reflectance0 + weight * (reflectance90 - reflectance0) * pow(clamp(1.0 - VdotN, 0., 1.), 5.0);
  78. }
  79. // Cook Torance Specular computation.
  80. vec3 computeSpecularTerm(float NdotH, float NdotL, float NdotV, float VdotH, float roughness, vec3 specularColor)
  81. {
  82. float alphaG = convertRoughnessToAverageSlope(roughness);
  83. float distribution = normalDistributionFunction_TrowbridgeReitzGGX(NdotH, alphaG);
  84. float visibility = smithVisibilityG_TrowbridgeReitzGGX_Walter(NdotL, NdotV, alphaG);
  85. visibility /= (4.0 * NdotL * NdotV); // Cook Torance Denominator integated in viibility to avoid issues when visibility function changes.
  86. vec3 fresnel = fresnelSchlickGGX(VdotH, specularColor, vec3(1., 1., 1.));
  87. float specTerm = max(0., visibility * distribution) * NdotL;
  88. return fresnel * specTerm * kPi; // TODO: audit pi constants
  89. }
  90. float computeDiffuseTerm(float NdotL, float NdotV, float VdotH, float roughness)
  91. {
  92. // Diffuse fresnel falloff as per Disney principled BRDF, and in the spirit of
  93. // of general coupled diffuse/specular models e.g. Ashikhmin Shirley.
  94. float diffuseFresnelNV = pow(clamp(1.0 - NdotL, 0.000001, 1.), 5.0);
  95. float diffuseFresnelNL = pow(clamp(1.0 - NdotV, 0.000001, 1.), 5.0);
  96. float diffuseFresnel90 = 0.5 + 2.0 * VdotH * VdotH * roughness;
  97. float diffuseFresnelTerm =
  98. (1.0 + (diffuseFresnel90 - 1.0) * diffuseFresnelNL) *
  99. (1.0 + (diffuseFresnel90 - 1.0) * diffuseFresnelNV);
  100. return diffuseFresnelTerm * NdotL;
  101. // PI Test
  102. // diffuseFresnelTerm /= kPi;
  103. }
  104. float computeDefaultMicroSurface(float microSurface, vec3 reflectivityColor)
  105. {
  106. float kReflectivityNoAlphaWorkflow_SmoothnessMax = 0.95;
  107. float reflectivityLuminance = getLuminance(reflectivityColor);
  108. float reflectivityLuma = sqrt(reflectivityLuminance);
  109. microSurface = reflectivityLuma * kReflectivityNoAlphaWorkflow_SmoothnessMax;
  110. return microSurface;
  111. }
  112. vec3 toLinearSpace(vec3 color)
  113. {
  114. return vec3(pow(color.r, 2.2), pow(color.g, 2.2), pow(color.b, 2.2));
  115. }
  116. vec3 toGammaSpace(vec3 color)
  117. {
  118. return vec3(pow(color.r, 1.0 / 2.2), pow(color.g, 1.0 / 2.2), pow(color.b, 1.0 / 2.2));
  119. }
  120. #ifdef CAMERATONEMAP
  121. vec3 toneMaps(vec3 color)
  122. {
  123. color = max(color, 0.0);
  124. // TONE MAPPING / EXPOSURE
  125. color.rgb = color.rgb * vCameraInfos.x;
  126. float tuning = 1.5; // TODO: sync up so e.g. 18% greys are matched to exposure appropriately
  127. // PI Test
  128. // tuning *= kPi;
  129. vec3 tonemapped = 1.0 - exp2(-color.rgb * tuning); // simple local photographic tonemapper
  130. color.rgb = mix(color.rgb, tonemapped, 1.0);
  131. return color;
  132. }
  133. #endif
  134. #ifdef CAMERACONTRAST
  135. vec4 contrasts(vec4 color)
  136. {
  137. color = clamp(color, 0.0, 1.0);
  138. vec3 resultHighContrast = color.rgb * color.rgb * (3.0 - 2.0 * color.rgb);
  139. float contrast = vCameraInfos.y;
  140. if (contrast < 1.0)
  141. {
  142. // Decrease contrast: interpolate towards zero-contrast image (flat grey)
  143. color.rgb = mix(vec3(0.5, 0.5, 0.5), color.rgb, contrast);
  144. }
  145. else
  146. {
  147. // Increase contrast: apply simple shoulder-toe high contrast curve
  148. color.rgb = mix(color.rgb, resultHighContrast, contrast - 1.0);
  149. }
  150. return color;
  151. }
  152. #endif
  153. // END PBR HELPER METHODS
  154. uniform vec4 vReflectivityColor;
  155. uniform vec3 vEmissiveColor;
  156. // Input
  157. varying vec3 vPositionW;
  158. #ifdef NORMAL
  159. varying vec3 vNormalW;
  160. #endif
  161. #ifdef VERTEXCOLOR
  162. varying vec4 vColor;
  163. #endif
  164. // Lights
  165. #ifdef LIGHT0
  166. uniform vec4 vLightData0;
  167. uniform vec4 vLightDiffuse0;
  168. #ifdef SPECULARTERM
  169. uniform vec3 vLightSpecular0;
  170. #endif
  171. #ifdef SHADOW0
  172. #if defined(SPOTLIGHT0) || defined(DIRLIGHT0)
  173. varying vec4 vPositionFromLight0;
  174. uniform sampler2D shadowSampler0;
  175. #else
  176. uniform samplerCube shadowSampler0;
  177. #endif
  178. uniform vec3 shadowsInfo0;
  179. #endif
  180. #ifdef SPOTLIGHT0
  181. uniform vec4 vLightDirection0;
  182. #endif
  183. #ifdef HEMILIGHT0
  184. uniform vec3 vLightGround0;
  185. #endif
  186. #endif
  187. #ifdef LIGHT1
  188. uniform vec4 vLightData1;
  189. uniform vec4 vLightDiffuse1;
  190. #ifdef SPECULARTERM
  191. uniform vec3 vLightSpecular1;
  192. #endif
  193. #ifdef SHADOW1
  194. #if defined(SPOTLIGHT1) || defined(DIRLIGHT1)
  195. varying vec4 vPositionFromLight1;
  196. uniform sampler2D shadowSampler1;
  197. #else
  198. uniform samplerCube shadowSampler1;
  199. #endif
  200. uniform vec3 shadowsInfo1;
  201. #endif
  202. #ifdef SPOTLIGHT1
  203. uniform vec4 vLightDirection1;
  204. #endif
  205. #ifdef HEMILIGHT1
  206. uniform vec3 vLightGround1;
  207. #endif
  208. #endif
  209. #ifdef LIGHT2
  210. uniform vec4 vLightData2;
  211. uniform vec4 vLightDiffuse2;
  212. #ifdef SPECULARTERM
  213. uniform vec3 vLightSpecular2;
  214. #endif
  215. #ifdef SHADOW2
  216. #if defined(SPOTLIGHT2) || defined(DIRLIGHT2)
  217. varying vec4 vPositionFromLight2;
  218. uniform sampler2D shadowSampler2;
  219. #else
  220. uniform samplerCube shadowSampler2;
  221. #endif
  222. uniform vec3 shadowsInfo2;
  223. #endif
  224. #ifdef SPOTLIGHT2
  225. uniform vec4 vLightDirection2;
  226. #endif
  227. #ifdef HEMILIGHT2
  228. uniform vec3 vLightGround2;
  229. #endif
  230. #endif
  231. #ifdef LIGHT3
  232. uniform vec4 vLightData3;
  233. uniform vec4 vLightDiffuse3;
  234. #ifdef SPECULARTERM
  235. uniform vec3 vLightSpecular3;
  236. #endif
  237. #ifdef SHADOW3
  238. #if defined(SPOTLIGHT3) || defined(DIRLIGHT3)
  239. varying vec4 vPositionFromLight3;
  240. uniform sampler2D shadowSampler3;
  241. #else
  242. uniform samplerCube shadowSampler3;
  243. #endif
  244. uniform vec3 shadowsInfo3;
  245. #endif
  246. #ifdef SPOTLIGHT3
  247. uniform vec4 vLightDirection3;
  248. #endif
  249. #ifdef HEMILIGHT3
  250. uniform vec3 vLightGround3;
  251. #endif
  252. #endif
  253. // Samplers
  254. #ifdef ALBEDO
  255. varying vec2 vAlbedoUV;
  256. uniform sampler2D albedoSampler;
  257. uniform vec2 vAlbedoInfos;
  258. #endif
  259. #ifdef AMBIENT
  260. varying vec2 vAmbientUV;
  261. uniform sampler2D ambientSampler;
  262. uniform vec2 vAmbientInfos;
  263. #endif
  264. #ifdef OPACITY
  265. varying vec2 vOpacityUV;
  266. uniform sampler2D opacitySampler;
  267. uniform vec2 vOpacityInfos;
  268. #endif
  269. #ifdef EMISSIVE
  270. varying vec2 vEmissiveUV;
  271. uniform vec2 vEmissiveInfos;
  272. uniform sampler2D emissiveSampler;
  273. #endif
  274. #ifdef LIGHTMAP
  275. varying vec2 vLightmapUV;
  276. uniform vec2 vLightmapInfos;
  277. uniform sampler2D lightmapSampler;
  278. #endif
  279. #if defined(REFLECTIVITY)
  280. varying vec2 vReflectivityUV;
  281. uniform vec2 vReflectivityInfos;
  282. uniform sampler2D reflectivitySampler;
  283. #endif
  284. // Fresnel
  285. #ifdef FRESNEL
  286. float computeFresnelTerm(vec3 viewDirection, vec3 worldNormal, float bias, float power)
  287. {
  288. float fresnelTerm = pow(bias + abs(dot(viewDirection, worldNormal)), power);
  289. return clamp(fresnelTerm, 0., 1.);
  290. }
  291. #endif
  292. #ifdef OPACITYFRESNEL
  293. uniform vec4 opacityParts;
  294. #endif
  295. #ifdef EMISSIVEFRESNEL
  296. uniform vec4 emissiveLeftColor;
  297. uniform vec4 emissiveRightColor;
  298. #endif
  299. // Reflection
  300. #ifdef REFLECTION
  301. uniform vec2 vReflectionInfos;
  302. #ifdef REFLECTIONMAP_3D
  303. uniform samplerCube reflectionCubeSampler;
  304. #else
  305. uniform sampler2D reflection2DSampler;
  306. #endif
  307. #ifdef REFLECTIONMAP_SKYBOX
  308. varying vec3 vPositionUVW;
  309. #else
  310. #ifdef REFLECTIONMAP_EQUIRECTANGULAR
  311. varying vec3 vDirectionW;
  312. #endif
  313. #if defined(REFLECTIONMAP_PLANAR) || defined(REFLECTIONMAP_CUBIC) || defined(REFLECTIONMAP_PROJECTION)
  314. uniform mat4 reflectionMatrix;
  315. #endif
  316. #if defined(REFLECTIONMAP_SPHERICAL) || defined(REFLECTIONMAP_PROJECTION)
  317. uniform mat4 view;
  318. #endif
  319. #endif
  320. vec3 computeReflectionCoords(vec4 worldPos, vec3 worldNormal)
  321. {
  322. #ifdef REFLECTIONMAP_EQUIRECTANGULAR
  323. vec3 direction = normalize(vDirectionW);
  324. float t = clamp(direction.y * -0.5 + 0.5, 0., 1.0);
  325. float s = atan(direction.z, direction.x) * RECIPROCAL_PI2 + 0.5;
  326. return vec3(s, t, 0);
  327. #endif
  328. #ifdef REFLECTIONMAP_SPHERICAL
  329. vec3 viewDir = normalize(vec3(view * worldPos));
  330. vec3 viewNormal = normalize(vec3(view * vec4(worldNormal, 0.0)));
  331. vec3 r = reflect(viewDir, viewNormal);
  332. r.z = r.z - 1.0;
  333. float m = 2.0 * length(r);
  334. return vec3(r.x / m + 0.5, 1.0 - r.y / m - 0.5, 0);
  335. #endif
  336. #ifdef REFLECTIONMAP_PLANAR
  337. vec3 viewDir = worldPos.xyz - vEyePosition;
  338. vec3 coords = normalize(reflect(viewDir, worldNormal));
  339. return vec3(reflectionMatrix * vec4(coords, 1));
  340. #endif
  341. #ifdef REFLECTIONMAP_CUBIC
  342. vec3 viewDir = worldPos.xyz - vEyePosition;
  343. vec3 coords = reflect(viewDir, worldNormal);
  344. #ifdef INVERTCUBICMAP
  345. coords.y = 1.0 - coords.y;
  346. #endif
  347. return vec3(reflectionMatrix * vec4(coords, 0));
  348. #endif
  349. #ifdef REFLECTIONMAP_PROJECTION
  350. return vec3(reflectionMatrix * (view * worldPos));
  351. #endif
  352. #ifdef REFLECTIONMAP_SKYBOX
  353. return vPositionUVW;
  354. #endif
  355. #ifdef REFLECTIONMAP_EXPLICIT
  356. return vec3(0, 0, 0);
  357. #endif
  358. }
  359. #endif
  360. // Shadows
  361. #ifdef SHADOWS
  362. float unpack(vec4 color)
  363. {
  364. const vec4 bit_shift = vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0);
  365. return dot(color, bit_shift);
  366. }
  367. #if defined(POINTLIGHT0) || defined(POINTLIGHT1) || defined(POINTLIGHT2) || defined(POINTLIGHT3)
  368. uniform vec2 depthValues;
  369. float computeShadowCube(vec3 lightPosition, samplerCube shadowSampler, float darkness, float bias)
  370. {
  371. vec3 directionToLight = vPositionW - lightPosition;
  372. float depth = length(directionToLight);
  373. depth = clamp(depth, 0., 1.0);
  374. directionToLight = normalize(directionToLight);
  375. directionToLight.y = - directionToLight.y;
  376. float shadow = unpack(textureCube(shadowSampler, directionToLight)) + bias;
  377. if (depth > shadow)
  378. {
  379. #ifdef OVERLOADEDSHADOWVALUES
  380. return mix(1.0, darkness, vOverloadedShadowIntensity.x);
  381. #else
  382. return darkness;
  383. #endif
  384. }
  385. return 1.0;
  386. }
  387. float computeShadowWithPCFCube(vec3 lightPosition, samplerCube shadowSampler, float mapSize, float bias, float darkness)
  388. {
  389. vec3 directionToLight = vPositionW - lightPosition;
  390. float depth = length(directionToLight);
  391. depth = clamp(depth, 0., 1.0);
  392. float diskScale = 2.0 / mapSize;
  393. directionToLight = normalize(directionToLight);
  394. directionToLight.y = -directionToLight.y;
  395. float visibility = 1.;
  396. vec3 poissonDisk[4];
  397. poissonDisk[0] = vec3(-1.0, 1.0, -1.0);
  398. poissonDisk[1] = vec3(1.0, -1.0, -1.0);
  399. poissonDisk[2] = vec3(-1.0, -1.0, -1.0);
  400. poissonDisk[3] = vec3(1.0, -1.0, 1.0);
  401. // Poisson Sampling
  402. float biasedDepth = depth - bias;
  403. if (unpack(textureCube(shadowSampler, directionToLight + poissonDisk[0] * diskScale)) < biasedDepth) visibility -= 0.25;
  404. if (unpack(textureCube(shadowSampler, directionToLight + poissonDisk[1] * diskScale)) < biasedDepth) visibility -= 0.25;
  405. if (unpack(textureCube(shadowSampler, directionToLight + poissonDisk[2] * diskScale)) < biasedDepth) visibility -= 0.25;
  406. if (unpack(textureCube(shadowSampler, directionToLight + poissonDisk[3] * diskScale)) < biasedDepth) visibility -= 0.25;
  407. #ifdef OVERLOADEDSHADOWVALUES
  408. return min(1.0, mix(1.0, visibility + darkness, vOverloadedShadowIntensity.x));
  409. #else
  410. return min(1.0, visibility + darkness);
  411. #endif
  412. }
  413. #endif
  414. #if defined(SPOTLIGHT0) || defined(SPOTLIGHT1) || defined(SPOTLIGHT2) || defined(SPOTLIGHT3) || defined(DIRLIGHT0) || defined(DIRLIGHT1) || defined(DIRLIGHT2) || defined(DIRLIGHT3)
  415. float computeShadow(vec4 vPositionFromLight, sampler2D shadowSampler, float darkness, float bias)
  416. {
  417. vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
  418. depth = 0.5 * depth + vec3(0.5);
  419. vec2 uv = depth.xy;
  420. if (uv.x < 0. || uv.x > 1.0 || uv.y < 0. || uv.y > 1.0)
  421. {
  422. return 1.0;
  423. }
  424. float shadow = unpack(texture2D(shadowSampler, uv)) + bias;
  425. if (depth.z > shadow)
  426. {
  427. #ifdef OVERLOADEDSHADOWVALUES
  428. return mix(1.0, darkness, vOverloadedShadowIntensity.x);
  429. #else
  430. return darkness;
  431. #endif
  432. }
  433. return 1.;
  434. }
  435. float computeShadowWithPCF(vec4 vPositionFromLight, sampler2D shadowSampler, float mapSize, float bias, float darkness)
  436. {
  437. vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
  438. depth = 0.5 * depth + vec3(0.5);
  439. vec2 uv = depth.xy;
  440. if (uv.x < 0. || uv.x > 1.0 || uv.y < 0. || uv.y > 1.0)
  441. {
  442. return 1.0;
  443. }
  444. float visibility = 1.;
  445. vec2 poissonDisk[4];
  446. poissonDisk[0] = vec2(-0.94201624, -0.39906216);
  447. poissonDisk[1] = vec2(0.94558609, -0.76890725);
  448. poissonDisk[2] = vec2(-0.094184101, -0.92938870);
  449. poissonDisk[3] = vec2(0.34495938, 0.29387760);
  450. // Poisson Sampling
  451. float biasedDepth = depth.z - bias;
  452. if (unpack(texture2D(shadowSampler, uv + poissonDisk[0] / mapSize)) < biasedDepth) visibility -= 0.25;
  453. if (unpack(texture2D(shadowSampler, uv + poissonDisk[1] / mapSize)) < biasedDepth) visibility -= 0.25;
  454. if (unpack(texture2D(shadowSampler, uv + poissonDisk[2] / mapSize)) < biasedDepth) visibility -= 0.25;
  455. if (unpack(texture2D(shadowSampler, uv + poissonDisk[3] / mapSize)) < biasedDepth) visibility -= 0.25;
  456. #ifdef OVERLOADEDSHADOWVALUES
  457. return min(1.0, mix(1.0, visibility + darkness, vOverloadedShadowIntensity.x));
  458. #else
  459. return min(1.0, visibility + darkness);
  460. #endif
  461. }
  462. // Thanks to http://devmaster.net/
  463. float unpackHalf(vec2 color)
  464. {
  465. return color.x + (color.y / 255.0);
  466. }
  467. float linstep(float low, float high, float v) {
  468. return clamp((v - low) / (high - low), 0.0, 1.0);
  469. }
  470. float ChebychevInequality(vec2 moments, float compare, float bias)
  471. {
  472. float p = smoothstep(compare - bias, compare, moments.x);
  473. float variance = max(moments.y - moments.x * moments.x, 0.02);
  474. float d = compare - moments.x;
  475. float p_max = linstep(0.2, 1.0, variance / (variance + d * d));
  476. return clamp(max(p, p_max), 0.0, 1.0);
  477. }
  478. float computeShadowWithVSM(vec4 vPositionFromLight, sampler2D shadowSampler, float bias, float darkness)
  479. {
  480. vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
  481. depth = 0.5 * depth + vec3(0.5);
  482. vec2 uv = depth.xy;
  483. if (uv.x < 0. || uv.x > 1.0 || uv.y < 0. || uv.y > 1.0 || depth.z >= 1.0)
  484. {
  485. return 1.0;
  486. }
  487. vec4 texel = texture2D(shadowSampler, uv);
  488. vec2 moments = vec2(unpackHalf(texel.xy), unpackHalf(texel.zw));
  489. #ifdef OVERLOADEDSHADOWVALUES
  490. return min(1.0, mix(1.0, 1.0 - ChebychevInequality(moments, depth.z, bias) + darkness, vOverloadedShadowIntensity.x));
  491. #else
  492. return min(1.0, 1.0 - ChebychevInequality(moments, depth.z, bias) + darkness);
  493. #endif
  494. }
  495. #endif
  496. #endif
  497. // Bump
  498. #ifdef BUMP
  499. varying vec2 vBumpUV;
  500. uniform vec2 vBumpInfos;
  501. uniform sampler2D bumpSampler;
  502. // Thanks to http://www.thetenthplanet.de/archives/1180
  503. mat3 cotangent_frame(vec3 normal, vec3 p, vec2 uv)
  504. {
  505. // get edge vectors of the pixel triangle
  506. vec3 dp1 = dFdx(p);
  507. vec3 dp2 = dFdy(p);
  508. vec2 duv1 = dFdx(uv);
  509. vec2 duv2 = dFdy(uv);
  510. // solve the linear system
  511. vec3 dp2perp = cross(dp2, normal);
  512. vec3 dp1perp = cross(normal, dp1);
  513. vec3 tangent = dp2perp * duv1.x + dp1perp * duv2.x;
  514. vec3 binormal = dp2perp * duv1.y + dp1perp * duv2.y;
  515. // construct a scale-invariant frame
  516. float invmax = inversesqrt(max(dot(tangent, tangent), dot(binormal, binormal)));
  517. return mat3(tangent * invmax, binormal * invmax, normal);
  518. }
  519. vec3 perturbNormal(vec3 viewDir)
  520. {
  521. vec3 map = texture2D(bumpSampler, vBumpUV).xyz;
  522. map = map * 255. / 127. - 128. / 127.;
  523. mat3 TBN = cotangent_frame(vNormalW * vBumpInfos.y, -viewDir, vBumpUV);
  524. return normalize(TBN * map);
  525. }
  526. #endif
  527. #ifdef CLIPPLANE
  528. varying float fClipDistance;
  529. #endif
  530. #ifdef LOGARITHMICDEPTH
  531. uniform float logarithmicDepthConstant;
  532. varying float vFragmentDepth;
  533. #endif
  534. // Fog
  535. #ifdef FOG
  536. #define FOGMODE_NONE 0.
  537. #define FOGMODE_EXP 1.
  538. #define FOGMODE_EXP2 2.
  539. #define FOGMODE_LINEAR 3.
  540. #define E 2.71828
  541. uniform vec4 vFogInfos;
  542. uniform vec3 vFogColor;
  543. varying float fFogDistance;
  544. float CalcFogFactor()
  545. {
  546. float fogCoeff = 1.0;
  547. float fogStart = vFogInfos.y;
  548. float fogEnd = vFogInfos.z;
  549. float fogDensity = vFogInfos.w;
  550. if (FOGMODE_LINEAR == vFogInfos.x)
  551. {
  552. fogCoeff = (fogEnd - fFogDistance) / (fogEnd - fogStart);
  553. }
  554. else if (FOGMODE_EXP == vFogInfos.x)
  555. {
  556. fogCoeff = 1.0 / pow(E, fFogDistance * fogDensity);
  557. }
  558. else if (FOGMODE_EXP2 == vFogInfos.x)
  559. {
  560. fogCoeff = 1.0 / pow(E, fFogDistance * fFogDistance * fogDensity * fogDensity);
  561. }
  562. return clamp(fogCoeff, 0.0, 1.0);
  563. }
  564. #endif
  565. // Light Computing
  566. struct lightingInfo
  567. {
  568. vec3 diffuse;
  569. #ifdef SPECULARTERM
  570. vec3 specular;
  571. #endif
  572. };
  573. lightingInfo computeLighting(vec3 viewDirectionW, vec3 vNormal, vec4 lightData, vec3 diffuseColor, vec3 specularColor, float range, float roughness, float NdotV) {
  574. lightingInfo result;
  575. vec3 lightVectorW;
  576. float attenuation = 1.0;
  577. if (lightData.w == 0.)
  578. {
  579. vec3 direction = lightData.xyz - vPositionW;
  580. attenuation = max(0., 1.0 - length(direction) / range);
  581. lightVectorW = normalize(direction);
  582. }
  583. else
  584. {
  585. lightVectorW = normalize(-lightData.xyz);
  586. }
  587. // diffuse
  588. vec3 H = normalize(viewDirectionW + lightVectorW);
  589. float NdotL = max(0.00000000001, dot(vNormal, lightVectorW));
  590. float VdotH = clamp(0.00000000001, 1.0, dot(viewDirectionW, H));
  591. float diffuseTerm = computeDiffuseTerm(NdotL, NdotV, VdotH, roughness);
  592. result.diffuse = diffuseTerm * diffuseColor * attenuation;
  593. #ifdef SPECULARTERM
  594. // Specular
  595. float NdotH = max(0.00000000001, dot(vNormal, H));
  596. vec3 specTerm = computeSpecularTerm(NdotH, NdotL, NdotV, VdotH, roughness, specularColor);
  597. result.specular = specTerm * attenuation;
  598. #endif
  599. return result;
  600. }
  601. lightingInfo computeSpotLighting(vec3 viewDirectionW, vec3 vNormal, vec4 lightData, vec4 lightDirection, vec3 diffuseColor, vec3 specularColor, float range, float roughness, float NdotV) {
  602. lightingInfo result;
  603. vec3 direction = lightData.xyz - vPositionW;
  604. vec3 lightVectorW = normalize(direction);
  605. float attenuation = max(0., 1.0 - length(direction) / range);
  606. // diffuse
  607. float cosAngle = max(0.0000001, dot(-lightDirection.xyz, lightVectorW));
  608. float spotAtten = 0.0;
  609. if (cosAngle >= lightDirection.w)
  610. {
  611. cosAngle = max(0., pow(cosAngle, lightData.w));
  612. spotAtten = clamp((cosAngle - lightDirection.w) / (1. - cosAngle), 0.0, 1.0);
  613. // Diffuse
  614. vec3 H = normalize(viewDirectionW - lightDirection.xyz);
  615. float NdotL = max(0.00000000001, dot(vNormal, -lightDirection.xyz));
  616. float VdotH = clamp(dot(viewDirectionW, H), 0.00000000001, 1.0);
  617. float diffuseTerm = computeDiffuseTerm(NdotL, NdotV, VdotH, roughness);
  618. result.diffuse = diffuseTerm * diffuseColor * attenuation * spotAtten;
  619. #ifdef SPECULARTERM
  620. // Specular
  621. float NdotH = max(0.00000000001, dot(vNormal, H));
  622. vec3 specTerm = computeSpecularTerm(NdotH, NdotL, NdotV, VdotH, roughness, specularColor);
  623. result.specular = specTerm * attenuation * spotAtten;
  624. #endif
  625. return result;
  626. }
  627. result.diffuse = vec3(0.);
  628. #ifdef SPECULARTERM
  629. result.specular = vec3(0.);
  630. #endif
  631. return result;
  632. }
  633. lightingInfo computeHemisphericLighting(vec3 viewDirectionW, vec3 vNormal, vec4 lightData, vec3 diffuseColor, vec3 specularColor, vec3 groundColor, float roughness, float NdotV) {
  634. lightingInfo result;
  635. vec3 lightVectorW = normalize(lightData.xyz);
  636. // Diffuse
  637. float ndl = dot(vNormal, lightData.xyz) * 0.5 + 0.5;
  638. result.diffuse = mix(groundColor, diffuseColor, ndl);
  639. #ifdef SPECULARTERM
  640. // Specular
  641. vec3 H = normalize(viewDirectionW + lightVectorW);
  642. float NdotH = max(0.00000000001, dot(vNormal, H));
  643. float NdotL = max(0.00000000001, ndl);
  644. float VdotH = clamp(0.00000000001, 1.0, dot(viewDirectionW, H));
  645. vec3 specTerm = computeSpecularTerm(NdotH, NdotL, NdotV, VdotH, roughness, specularColor);
  646. result.specular = specTerm;
  647. #endif
  648. return result;
  649. }
  650. void main(void) {
  651. // Clip plane
  652. #ifdef CLIPPLANE
  653. if (fClipDistance > 0.0)
  654. discard;
  655. #endif
  656. vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
  657. // Base color
  658. vec4 baseColor = vec4(1., 1., 1., 1.);
  659. vec3 albedoColor = vAlbedoColor.rgb;
  660. // Alpha
  661. float alpha = vAlbedoColor.a;
  662. #ifdef ALBEDO
  663. baseColor = texture2D(albedoSampler, vAlbedoUV);
  664. baseColor = vec4(toLinearSpace(baseColor.rgb), baseColor.a);
  665. #ifdef ALPHATEST
  666. if (baseColor.a < 0.4)
  667. discard;
  668. #endif
  669. #ifdef ALPHAFROMALBEDO
  670. alpha *= baseColor.a;
  671. #endif
  672. baseColor.rgb *= vAlbedoInfos.y;
  673. #endif
  674. #ifdef VERTEXCOLOR
  675. baseColor.rgb *= vColor.rgb;
  676. #endif
  677. #ifdef OVERLOADEDVALUES
  678. baseColor.rgb = mix(baseColor.rgb, vOverloadedAlbedo, vOverloadedIntensity.y);
  679. albedoColor.rgb = mix(albedoColor.rgb, vOverloadedAlbedo, vOverloadedIntensity.y);
  680. #endif
  681. // Bump
  682. #ifdef NORMAL
  683. vec3 normalW = normalize(vNormalW);
  684. #else
  685. vec3 normalW = vec3(1.0, 1.0, 1.0);
  686. #endif
  687. #ifdef BUMP
  688. normalW = perturbNormal(viewDirectionW);
  689. #endif
  690. // Ambient color
  691. vec3 baseAmbientColor = vec3(1., 1., 1.);
  692. #ifdef AMBIENT
  693. baseAmbientColor = texture2D(ambientSampler, vAmbientUV).rgb * vAmbientInfos.y;
  694. #ifdef OVERLOADEDVALUES
  695. baseAmbientColor.rgb = mix(baseAmbientColor.rgb, vOverloadedAmbient, vOverloadedIntensity.x);
  696. #endif
  697. #endif
  698. // Specular map
  699. float microSurface = vReflectivityColor.a;
  700. vec3 reflectivityColor = vReflectivityColor.rgb;
  701. #ifdef OVERLOADEDVALUES
  702. reflectivityColor.rgb = mix(reflectivityColor.rgb, vOverloadedReflectivity, vOverloadedIntensity.z);
  703. #endif
  704. #ifdef REFLECTIVITY
  705. vec4 reflectivityMapColor = texture2D(reflectivitySampler, vReflectivityUV);
  706. reflectivityColor = toLinearSpace(reflectivityMapColor.rgb);
  707. #ifdef OVERLOADEDVALUES
  708. reflectivityColor.rgb = mix(reflectivityColor.rgb, vOverloadedReflectivity, vOverloadedIntensity.z);
  709. #endif
  710. #ifdef MICROSURFACEFROMREFLECTIVITYMAP
  711. microSurface = reflectivityMapColor.a;
  712. #else
  713. microSurface = computeDefaultMicroSurface(microSurface, reflectivityColor);
  714. #endif
  715. #endif
  716. #ifdef OVERLOADEDVALUES
  717. microSurface = mix(microSurface, vOverloadedMicroSurface.x, vOverloadedMicroSurface.y);
  718. #endif
  719. // Apply Energy Conservation taking in account the environment level only if the environment is present.
  720. float reflectance = max(max(reflectivityColor.r, reflectivityColor.g), reflectivityColor.b);
  721. baseColor.rgb = (1. - reflectance) * baseColor.rgb;
  722. // Compute Specular Fresnel + Reflectance.
  723. float NdotV = max(0.00000000001, dot(normalW, viewDirectionW));
  724. // Adapt microSurface.
  725. microSurface = clamp(microSurface, 0., 1.) * 0.98;
  726. // Call rough to not conflict with previous one.
  727. float rough = clamp(1. - microSurface, 0.000001, 1.0);
  728. // Lighting
  729. vec3 diffuseBase = vec3(0., 0., 0.);
  730. #ifdef OVERLOADEDSHADOWVALUES
  731. vec3 shadowedOnlyDiffuseBase = vec3(1., 1., 1.);
  732. #endif
  733. #ifdef SPECULARTERM
  734. vec3 specularBase = vec3(0., 0., 0.);
  735. #endif
  736. float shadow = 1.;
  737. #ifdef LIGHT0
  738. #ifndef SPECULARTERM
  739. vec3 vLightSpecular0 = vec3(0.0);
  740. #endif
  741. #ifdef SPOTLIGHT0
  742. lightingInfo info = computeSpotLighting(viewDirectionW, normalW, vLightData0, vLightDirection0, vLightDiffuse0.rgb, vLightSpecular0, vLightDiffuse0.a, rough, NdotV);
  743. #endif
  744. #ifdef HEMILIGHT0
  745. lightingInfo info = computeHemisphericLighting(viewDirectionW, normalW, vLightData0, vLightDiffuse0.rgb, vLightSpecular0, vLightGround0, rough, NdotV);
  746. #endif
  747. #if defined(POINTLIGHT0) || defined(DIRLIGHT0)
  748. lightingInfo info = computeLighting(viewDirectionW, normalW, vLightData0, vLightDiffuse0.rgb, vLightSpecular0, vLightDiffuse0.a, rough, NdotV);
  749. #endif
  750. #ifdef SHADOW0
  751. #ifdef SHADOWVSM0
  752. shadow = computeShadowWithVSM(vPositionFromLight0, shadowSampler0, shadowsInfo0.z, shadowsInfo0.x);
  753. #else
  754. #ifdef SHADOWPCF0
  755. #if defined(POINTLIGHT0)
  756. shadow = computeShadowWithPCFCube(vLightData0.xyz, shadowSampler0, shadowsInfo0.y, shadowsInfo0.z, shadowsInfo0.x);
  757. #else
  758. shadow = computeShadowWithPCF(vPositionFromLight0, shadowSampler0, shadowsInfo0.y, shadowsInfo0.z, shadowsInfo0.x);
  759. #endif
  760. #else
  761. #if defined(POINTLIGHT0)
  762. shadow = computeShadowCube(vLightData0.xyz, shadowSampler0, shadowsInfo0.x, shadowsInfo0.z);
  763. #else
  764. shadow = computeShadow(vPositionFromLight0, shadowSampler0, shadowsInfo0.x, shadowsInfo0.z);
  765. #endif
  766. #endif
  767. #endif
  768. #else
  769. shadow = 1.;
  770. #endif
  771. diffuseBase += info.diffuse * shadow;
  772. #ifdef OVERLOADEDSHADOWVALUES
  773. shadowedOnlyDiffuseBase *= shadow;
  774. #endif
  775. #ifdef SPECULARTERM
  776. specularBase += info.specular * shadow;
  777. #endif
  778. #endif
  779. #ifdef LIGHT1
  780. #ifndef SPECULARTERM
  781. vec3 vLightSpecular1 = vec3(0.0);
  782. #endif
  783. #ifdef SPOTLIGHT1
  784. info = computeSpotLighting(viewDirectionW, normalW, vLightData1, vLightDirection1, vLightDiffuse1.rgb, vLightSpecular1, vLightDiffuse1.a, rough, NdotV);
  785. #endif
  786. #ifdef HEMILIGHT1
  787. info = computeHemisphericLighting(viewDirectionW, normalW, vLightData1, vLightDiffuse1.rgb, vLightSpecular1, vLightGround1, rough, NdotV);
  788. #endif
  789. #if defined(POINTLIGHT1) || defined(DIRLIGHT1)
  790. info = computeLighting(viewDirectionW, normalW, vLightData1, vLightDiffuse1.rgb, vLightSpecular1, vLightDiffuse1.a, rough, NdotV);
  791. #endif
  792. #ifdef SHADOW1
  793. #ifdef SHADOWVSM1
  794. shadow = computeShadowWithVSM(vPositionFromLight1, shadowSampler1, shadowsInfo1.z, shadowsInfo1.x);
  795. #else
  796. #ifdef SHADOWPCF1
  797. #if defined(POINTLIGHT1)
  798. shadow = computeShadowWithPCFCube(vLightData1.xyz, shadowSampler1, shadowsInfo1.y, shadowsInfo1.z, shadowsInfo1.x);
  799. #else
  800. shadow = computeShadowWithPCF(vPositionFromLight1, shadowSampler1, shadowsInfo1.y, shadowsInfo1.z, shadowsInfo1.x);
  801. #endif
  802. #else
  803. #if defined(POINTLIGHT1)
  804. shadow = computeShadowCube(vLightData1.xyz, shadowSampler1, shadowsInfo1.x, shadowsInfo1.z);
  805. #else
  806. shadow = computeShadow(vPositionFromLight1, shadowSampler1, shadowsInfo1.x, shadowsInfo1.z);
  807. #endif
  808. #endif
  809. #endif
  810. #else
  811. shadow = 1.;
  812. #endif
  813. diffuseBase += info.diffuse * shadow;
  814. #ifdef OVERLOADEDSHADOWVALUES
  815. shadowedOnlyDiffuseBase *= shadow;
  816. #endif
  817. #ifdef SPECULARTERM
  818. specularBase += info.specular * shadow;
  819. #endif
  820. #endif
  821. #ifdef LIGHT2
  822. #ifndef SPECULARTERM
  823. vec3 vLightSpecular2 = vec3(0.0);
  824. #endif
  825. #ifdef SPOTLIGHT2
  826. info = computeSpotLighting(viewDirectionW, normalW, vLightData2, vLightDirection2, vLightDiffuse2.rgb, vLightSpecular2, vLightDiffuse2.a, rough, NdotV);
  827. #endif
  828. #ifdef HEMILIGHT2
  829. info = computeHemisphericLighting(viewDirectionW, normalW, vLightData2, vLightDiffuse2.rgb, vLightSpecular2, vLightGround2, rough, NdotV);
  830. #endif
  831. #if defined(POINTLIGHT2) || defined(DIRLIGHT2)
  832. info = computeLighting(viewDirectionW, normalW, vLightData2, vLightDiffuse2.rgb, vLightSpecular2, vLightDiffuse2.a, rough, NdotV);
  833. #endif
  834. #ifdef SHADOW2
  835. #ifdef SHADOWVSM2
  836. shadow = computeShadowWithVSM(vPositionFromLight2, shadowSampler2, shadowsInfo2.z, shadowsInfo2.x);
  837. #else
  838. #ifdef SHADOWPCF2
  839. #if defined(POINTLIGHT2)
  840. shadow = computeShadowWithPCFCube(vLightData2.xyz, shadowSampler2, shadowsInfo2.y, shadowsInfo2.z, shadowsInfo2.x);
  841. #else
  842. shadow = computeShadowWithPCF(vPositionFromLight2, shadowSampler2, shadowsInfo2.y, shadowsInfo2.z, shadowsInfo2.x);
  843. #endif
  844. #else
  845. #if defined(POINTLIGHT2)
  846. shadow = computeShadowCube(vLightData2.xyz, shadowSampler2, shadowsInfo2.x, shadowsInfo2.z);
  847. #else
  848. shadow = computeShadow(vPositionFromLight2, shadowSampler2, shadowsInfo2.x, shadowsInfo2.z);
  849. #endif
  850. #endif
  851. #endif
  852. #else
  853. shadow = 1.;
  854. #endif
  855. diffuseBase += info.diffuse * shadow;
  856. #ifdef OVERLOADEDSHADOWVALUES
  857. shadowedOnlyDiffuseBase *= shadow;
  858. #endif
  859. #ifdef SPECULARTERM
  860. specularBase += info.specular * shadow;
  861. #endif
  862. #endif
  863. #ifdef LIGHT3
  864. #ifndef SPECULARTERM
  865. vec3 vLightSpecular3 = vec3(0.0);
  866. #endif
  867. #ifdef SPOTLIGHT3
  868. info = computeSpotLighting(viewDirectionW, normalW, vLightData3, vLightDirection3, vLightDiffuse3.rgb, vLightSpecular3, vLightDiffuse3.a, rough, NdotV);
  869. #endif
  870. #ifdef HEMILIGHT3
  871. info = computeHemisphericLighting(viewDirectionW, normalW, vLightData3, vLightDiffuse3.rgb, vLightSpecular3, vLightGround3, rough, NdotV);
  872. #endif
  873. #if defined(POINTLIGHT3) || defined(DIRLIGHT3)
  874. info = computeLighting(viewDirectionW, normalW, vLightData3, vLightDiffuse3.rgb, vLightSpecular3, vLightDiffuse3.a, rough, NdotV);
  875. #endif
  876. #ifdef SHADOW3
  877. #ifdef SHADOWVSM3
  878. shadow = computeShadowWithVSM(vPositionFromLight3, shadowSampler3, shadowsInfo3.z, shadowsInfo3.x);
  879. #else
  880. #ifdef SHADOWPCF3
  881. #if defined(POINTLIGHT3)
  882. shadow = computeShadowWithPCFCube(vLightData3.xyz, shadowSampler3, shadowsInfo3.y, shadowsInfo3.z, shadowsInfo3.x);
  883. #else
  884. shadow = computeShadowWithPCF(vPositionFromLight3, shadowSampler3, shadowsInfo3.y, shadowsInfo3.z, shadowsInfo3.x);
  885. #endif
  886. #else
  887. #if defined(POINTLIGHT3)
  888. shadow = computeShadowCube(vLightData3.xyz, shadowSampler3, shadowsInfo3.x, shadowsInfo3.z);
  889. #else
  890. shadow = computeShadow(vPositionFromLight3, shadowSampler3, shadowsInfo3.x, shadowsInfo3.z);
  891. #endif
  892. #endif
  893. #endif
  894. #else
  895. shadow = 1.;
  896. #endif
  897. diffuseBase += info.diffuse * shadow;
  898. #ifdef OVERLOADEDSHADOWVALUES
  899. shadowedOnlyDiffuseBase *= shadow;
  900. #endif
  901. #ifdef SPECULARTERM
  902. specularBase += info.specular * shadow;
  903. #endif
  904. #endif
  905. // Reflection
  906. vec3 reflectionColor = vReflectionColor.rgb;
  907. vec3 ambientReflectionColor = vReflectionColor.rgb;
  908. #ifdef REFLECTION
  909. vec3 vReflectionUVW = computeReflectionCoords(vec4(vPositionW, 1.0), normalW);
  910. #ifdef REFLECTIONMAP_3D
  911. // Go mat -> blurry reflexion according to microSurface
  912. float bias = 20. * (1.0 - microSurface);
  913. reflectionColor = textureCube(reflectionCubeSampler, vReflectionUVW, bias).rgb * vReflectionInfos.x;
  914. reflectionColor = toLinearSpace(reflectionColor.rgb);
  915. ambientReflectionColor = textureCube(reflectionCubeSampler, normalW, 20.).rgb * vReflectionInfos.x;
  916. ambientReflectionColor = toLinearSpace(ambientReflectionColor.rgb);
  917. #else
  918. vec2 coords = vReflectionUVW.xy;
  919. #ifdef REFLECTIONMAP_PROJECTION
  920. coords /= vReflectionUVW.z;
  921. #endif
  922. coords.y = 1.0 - coords.y;
  923. reflectionColor = texture2D(reflection2DSampler, coords).rgb * vReflectionInfos.x;
  924. reflectionColor = toLinearSpace(reflectionColor.rgb);
  925. ambientReflectionColor = texture2D(reflection2DSampler, coords, 20.).rgb * vReflectionInfos.x;
  926. ambientReflectionColor = toLinearSpace(ambientReflectionColor.rgb);
  927. #endif
  928. #endif
  929. #ifdef OVERLOADEDVALUES
  930. ambientReflectionColor = mix(ambientReflectionColor, vOverloadedReflection, vOverloadedMicroSurface.z);
  931. reflectionColor = mix(reflectionColor, vOverloadedReflection, vOverloadedMicroSurface.z);
  932. #endif
  933. reflectionColor *= vLightingIntensity.z;
  934. ambientReflectionColor *= vLightingIntensity.z;
  935. // Compute reflection specular fresnel
  936. vec3 specularEnvironmentR0 = reflectivityColor.rgb;
  937. vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0);
  938. vec3 specularEnvironmentReflectanceViewer = FresnelSchlickEnvironmentGGX(clamp(NdotV, 0., 1.), specularEnvironmentR0, specularEnvironmentR90, sqrt(microSurface));
  939. reflectionColor *= specularEnvironmentReflectanceViewer;
  940. #ifdef OPACITY
  941. vec4 opacityMap = texture2D(opacitySampler, vOpacityUV);
  942. #ifdef OPACITYRGB
  943. opacityMap.rgb = opacityMap.rgb * vec3(0.3, 0.59, 0.11);
  944. alpha *= (opacityMap.x + opacityMap.y + opacityMap.z)* vOpacityInfos.y;
  945. #else
  946. alpha *= opacityMap.a * vOpacityInfos.y;
  947. #endif
  948. #endif
  949. #ifdef VERTEXALPHA
  950. alpha *= vColor.a;
  951. #endif
  952. #ifdef OPACITYFRESNEL
  953. float opacityFresnelTerm = computeFresnelTerm(viewDirectionW, normalW, opacityParts.z, opacityParts.w);
  954. alpha += opacityParts.x * (1.0 - opacityFresnelTerm) + opacityFresnelTerm * opacityParts.y;
  955. #endif
  956. // Emissive
  957. vec3 emissiveColor = vEmissiveColor;
  958. #ifdef EMISSIVE
  959. vec3 emissiveColorTex = texture2D(emissiveSampler, vEmissiveUV).rgb;
  960. emissiveColor = toLinearSpace(emissiveColorTex.rgb) * emissiveColor * vEmissiveInfos.y;
  961. #endif
  962. #ifdef OVERLOADEDVALUES
  963. emissiveColor = mix(emissiveColor, vOverloadedEmissive, vOverloadedIntensity.w);
  964. #endif
  965. #ifdef EMISSIVEFRESNEL
  966. float emissiveFresnelTerm = computeFresnelTerm(viewDirectionW, normalW, emissiveRightColor.a, emissiveLeftColor.a);
  967. emissiveColor *= emissiveLeftColor.rgb * (1.0 - emissiveFresnelTerm) + emissiveFresnelTerm * emissiveRightColor.rgb;
  968. #endif
  969. // Composition
  970. #ifdef EMISSIVEASILLUMINATION
  971. vec3 finalDiffuse = max(diffuseBase * albedoColor + vAmbientColor, 0.0) * baseColor.rgb;
  972. #ifdef OVERLOADEDSHADOWVALUES
  973. shadowedOnlyDiffuseBase = max(shadowedOnlyDiffuseBase * albedoColor + vAmbientColor, 0.0) * baseColor.rgb;
  974. #endif
  975. #else
  976. #ifdef LINKEMISSIVEWITHALBEDO
  977. vec3 finalDiffuse = max((diffuseBase + emissiveColor) * albedoColor + vAmbientColor, 0.0) * baseColor.rgb;
  978. #ifdef OVERLOADEDSHADOWVALUES
  979. shadowedOnlyDiffuseBase = max((shadowedOnlyDiffuseBase + emissiveColor) * albedoColor + vAmbientColor, 0.0) * baseColor.rgb;
  980. #endif
  981. #else
  982. vec3 finalDiffuse = max(diffuseBase * albedoColor + emissiveColor + vAmbientColor, 0.0) * baseColor.rgb;
  983. #ifdef OVERLOADEDSHADOWVALUES
  984. shadowedOnlyDiffuseBase = max(shadowedOnlyDiffuseBase * albedoColor + emissiveColor + vAmbientColor, 0.0) * baseColor.rgb;
  985. #endif
  986. #endif
  987. #endif
  988. #ifdef OVERLOADEDSHADOWVALUES
  989. finalDiffuse = mix(finalDiffuse, shadowedOnlyDiffuseBase, (1.0 - vOverloadedShadowIntensity.y));
  990. #endif
  991. // diffuse lighting from environment 0.2 replaces Harmonic...
  992. // Ambient Reflection already includes the environment intensity.
  993. finalDiffuse += baseColor.rgb * ambientReflectionColor * 0.2;
  994. #ifdef SPECULARTERM
  995. vec3 finalSpecular = specularBase * reflectivityColor * vLightingIntensity.w;
  996. #else
  997. vec3 finalSpecular = vec3(0.0);
  998. #endif
  999. #ifdef OVERLOADEDSHADOWVALUES
  1000. finalSpecular = mix(finalSpecular, vec3(0.0), (1.0 - vOverloadedShadowIntensity.y));
  1001. #endif
  1002. #ifdef SPECULAROVERALPHA
  1003. alpha = clamp(alpha + dot(finalSpecular, vec3(0.3, 0.59, 0.11)), 0., 1.);
  1004. #endif
  1005. // Composition
  1006. // Reflection already includes the environment intensity.
  1007. #ifdef EMISSIVEASILLUMINATION
  1008. vec4 color = vec4(finalDiffuse * baseAmbientColor * vLightingIntensity.x + finalSpecular * vLightingIntensity.x + reflectionColor + emissiveColor * vLightingIntensity.y, alpha);
  1009. #else
  1010. vec4 color = vec4(finalDiffuse * baseAmbientColor * vLightingIntensity.x + finalSpecular * vLightingIntensity.x + reflectionColor, alpha);
  1011. #endif
  1012. #ifdef LIGHTMAP
  1013. vec3 lightmapColor = texture2D(lightmapSampler, vLightmapUV).rgb * vLightmapInfos.y;
  1014. #ifdef USELIGHTMAPASSHADOWMAP
  1015. color.rgb *= lightmapColor;
  1016. #else
  1017. color.rgb += lightmapColor;
  1018. #endif
  1019. #endif
  1020. #ifdef FOG
  1021. float fog = CalcFogFactor();
  1022. color.rgb = fog * color.rgb + (1.0 - fog) * vFogColor;
  1023. #endif
  1024. color = max(color, 0.0);
  1025. #ifdef CAMERATONEMAP
  1026. color.rgb = toneMaps(color.rgb);
  1027. #endif
  1028. color.rgb = toGammaSpace(color.rgb);
  1029. #ifdef CAMERACONTRAST
  1030. color = contrasts(color);
  1031. #endif
  1032. // Normal Display.
  1033. // gl_FragColor = vec4(normalW * 0.5 + 0.5, 1.0);
  1034. // Ambient reflection color.
  1035. // gl_FragColor = vec4(ambientReflectionColor, 1.0);
  1036. // Reflection color.
  1037. // gl_FragColor = vec4(reflectionColor, 1.0);
  1038. // Base color.
  1039. // gl_FragColor = vec4(baseColor.rgb, 1.0);
  1040. // Specular color.
  1041. // gl_FragColor = vec4(reflectivityColor.rgb, 1.0);
  1042. // MicroSurface color.
  1043. // gl_FragColor = vec4(microSurface, microSurface, microSurface, 1.0);
  1044. // Specular Map
  1045. // gl_FragColor = vec4(reflectivityMapColor.rgb, 1.0);
  1046. //// Emissive Color
  1047. //vec2 test = vEmissiveUV * 0.5 + 0.5;
  1048. //gl_FragColor = vec4(test.x, test.y, 1.0, 1.0);
  1049. gl_FragColor = color;
  1050. }