WebGLMaterials.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. import { BackSide } from '../../constants.js';
  2. function WebGLMaterials( properties ) {
  3. function refreshFogUniforms( uniforms, fog ) {
  4. uniforms.fogColor.value.copy( fog.color );
  5. if ( fog.isFog ) {
  6. uniforms.fogNear.value = fog.near;
  7. uniforms.fogFar.value = fog.far;
  8. } else if ( fog.isFogExp2 ) {
  9. uniforms.fogDensity.value = fog.density;
  10. }
  11. }
  12. function refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {
  13. if ( material.isMeshBasicMaterial ) {
  14. refreshUniformsCommon( uniforms, material );
  15. } else if ( material.isMeshLambertMaterial ) {
  16. refreshUniformsCommon( uniforms, material );
  17. refreshUniformsLambert( uniforms, material );
  18. } else if ( material.isMeshToonMaterial ) {
  19. refreshUniformsCommon( uniforms, material );
  20. refreshUniformsToon( uniforms, material );
  21. } else if ( material.isMeshPhongMaterial ) {
  22. refreshUniformsCommon( uniforms, material );
  23. refreshUniformsPhong( uniforms, material );
  24. } else if ( material.isMeshStandardMaterial ) {
  25. refreshUniformsCommon( uniforms, material );
  26. if ( material.isMeshPhysicalMaterial ) {
  27. refreshUniformsPhysical( uniforms, material, transmissionRenderTarget );
  28. } else {
  29. refreshUniformsStandard( uniforms, material );
  30. }
  31. } else if ( material.isMeshMatcapMaterial ) {
  32. refreshUniformsCommon( uniforms, material );
  33. refreshUniformsMatcap( uniforms, material );
  34. } else if ( material.isMeshDepthMaterial ) {
  35. refreshUniformsCommon( uniforms, material );
  36. refreshUniformsDepth( uniforms, material );
  37. } else if ( material.isMeshDistanceMaterial ) {
  38. refreshUniformsCommon( uniforms, material );
  39. refreshUniformsDistance( uniforms, material );
  40. } else if ( material.isMeshNormalMaterial ) {
  41. refreshUniformsCommon( uniforms, material );
  42. refreshUniformsNormal( uniforms, material );
  43. } else if ( material.isLineBasicMaterial ) {
  44. refreshUniformsLine( uniforms, material );
  45. if ( material.isLineDashedMaterial ) {
  46. refreshUniformsDash( uniforms, material );
  47. }
  48. } else if ( material.isPointsMaterial ) {
  49. refreshUniformsPoints( uniforms, material, pixelRatio, height );
  50. } else if ( material.isSpriteMaterial ) {
  51. refreshUniformsSprites( uniforms, material );
  52. } else if ( material.isShadowMaterial ) {
  53. uniforms.color.value.copy( material.color );
  54. uniforms.opacity.value = material.opacity;
  55. } else if ( material.isShaderMaterial ) {
  56. material.uniformsNeedUpdate = false; // #15581
  57. }
  58. }
  59. function refreshUniformsCommon( uniforms, material ) {
  60. uniforms.opacity.value = material.opacity;
  61. if ( material.color ) {
  62. uniforms.diffuse.value.copy( material.color );
  63. }
  64. if ( material.emissive ) {
  65. uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
  66. }
  67. if ( material.map ) {
  68. uniforms.map.value = material.map;
  69. }
  70. if ( material.alphaMap ) {
  71. uniforms.alphaMap.value = material.alphaMap;
  72. }
  73. if ( material.specularMap ) {
  74. uniforms.specularMap.value = material.specularMap;
  75. }
  76. if ( material.alphaTest > 0 ) {
  77. uniforms.alphaTest.value = material.alphaTest;
  78. }
  79. const envMap = properties.get( material ).envMap;
  80. if ( envMap ) {
  81. uniforms.envMap.value = envMap;
  82. uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
  83. uniforms.reflectivity.value = material.reflectivity;
  84. uniforms.ior.value = material.ior;
  85. uniforms.refractionRatio.value = material.refractionRatio;
  86. const maxMipLevel = properties.get( envMap ).__maxMipLevel;
  87. if ( maxMipLevel !== undefined ) {
  88. uniforms.maxMipLevel.value = maxMipLevel;
  89. }
  90. }
  91. if ( material.lightMap ) {
  92. uniforms.lightMap.value = material.lightMap;
  93. uniforms.lightMapIntensity.value = material.lightMapIntensity;
  94. }
  95. if ( material.aoMap ) {
  96. uniforms.aoMap.value = material.aoMap;
  97. uniforms.aoMapIntensity.value = material.aoMapIntensity;
  98. }
  99. // uv repeat and offset setting priorities
  100. // 1. color map
  101. // 2. specular map
  102. // 3. displacementMap map
  103. // 4. normal map
  104. // 5. bump map
  105. // 6. roughnessMap map
  106. // 7. metalnessMap map
  107. // 8. alphaMap map
  108. // 9. emissiveMap map
  109. // 10. clearcoat map
  110. // 11. clearcoat normal map
  111. // 12. clearcoat roughnessMap map
  112. // 13. specular intensity map
  113. // 14. specular tint map
  114. // 15. transmission map
  115. // 16. thickness map
  116. let uvScaleMap;
  117. if ( material.map ) {
  118. uvScaleMap = material.map;
  119. } else if ( material.specularMap ) {
  120. uvScaleMap = material.specularMap;
  121. } else if ( material.displacementMap ) {
  122. uvScaleMap = material.displacementMap;
  123. } else if ( material.normalMap ) {
  124. uvScaleMap = material.normalMap;
  125. } else if ( material.bumpMap ) {
  126. uvScaleMap = material.bumpMap;
  127. } else if ( material.roughnessMap ) {
  128. uvScaleMap = material.roughnessMap;
  129. } else if ( material.metalnessMap ) {
  130. uvScaleMap = material.metalnessMap;
  131. } else if ( material.alphaMap ) {
  132. uvScaleMap = material.alphaMap;
  133. } else if ( material.emissiveMap ) {
  134. uvScaleMap = material.emissiveMap;
  135. } else if ( material.clearcoatMap ) {
  136. uvScaleMap = material.clearcoatMap;
  137. } else if ( material.clearcoatNormalMap ) {
  138. uvScaleMap = material.clearcoatNormalMap;
  139. } else if ( material.clearcoatRoughnessMap ) {
  140. uvScaleMap = material.clearcoatRoughnessMap;
  141. } else if ( material.specularIntensityMap ) {
  142. uvScaleMap = material.specularIntensityMap;
  143. } else if ( material.specularTintMap ) {
  144. uvScaleMap = material.specularTintMap;
  145. } else if ( material.transmissionMap ) {
  146. uvScaleMap = material.transmissionMap;
  147. } else if ( material.thicknessMap ) {
  148. uvScaleMap = material.thicknessMap;
  149. }
  150. if ( uvScaleMap !== undefined ) {
  151. // backwards compatibility
  152. if ( uvScaleMap.isWebGLRenderTarget ) {
  153. uvScaleMap = uvScaleMap.texture;
  154. }
  155. if ( uvScaleMap.matrixAutoUpdate === true ) {
  156. uvScaleMap.updateMatrix();
  157. }
  158. uniforms.uvTransform.value.copy( uvScaleMap.matrix );
  159. }
  160. // uv repeat and offset setting priorities for uv2
  161. // 1. ao map
  162. // 2. light map
  163. let uv2ScaleMap;
  164. if ( material.aoMap ) {
  165. uv2ScaleMap = material.aoMap;
  166. } else if ( material.lightMap ) {
  167. uv2ScaleMap = material.lightMap;
  168. }
  169. if ( uv2ScaleMap !== undefined ) {
  170. // backwards compatibility
  171. if ( uv2ScaleMap.isWebGLRenderTarget ) {
  172. uv2ScaleMap = uv2ScaleMap.texture;
  173. }
  174. if ( uv2ScaleMap.matrixAutoUpdate === true ) {
  175. uv2ScaleMap.updateMatrix();
  176. }
  177. uniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );
  178. }
  179. }
  180. function refreshUniformsLine( uniforms, material ) {
  181. uniforms.diffuse.value.copy( material.color );
  182. uniforms.opacity.value = material.opacity;
  183. }
  184. function refreshUniformsDash( uniforms, material ) {
  185. uniforms.dashSize.value = material.dashSize;
  186. uniforms.totalSize.value = material.dashSize + material.gapSize;
  187. uniforms.scale.value = material.scale;
  188. }
  189. function refreshUniformsPoints( uniforms, material, pixelRatio, height ) {
  190. uniforms.diffuse.value.copy( material.color );
  191. uniforms.opacity.value = material.opacity;
  192. uniforms.size.value = material.size * pixelRatio;
  193. uniforms.scale.value = height * 0.5;
  194. if ( material.map ) {
  195. uniforms.map.value = material.map;
  196. }
  197. if ( material.alphaMap ) {
  198. uniforms.alphaMap.value = material.alphaMap;
  199. }
  200. if ( material.alphaTest > 0 ) {
  201. uniforms.alphaTest.value = material.alphaTest;
  202. }
  203. // uv repeat and offset setting priorities
  204. // 1. color map
  205. // 2. alpha map
  206. let uvScaleMap;
  207. if ( material.map ) {
  208. uvScaleMap = material.map;
  209. } else if ( material.alphaMap ) {
  210. uvScaleMap = material.alphaMap;
  211. }
  212. if ( uvScaleMap !== undefined ) {
  213. if ( uvScaleMap.matrixAutoUpdate === true ) {
  214. uvScaleMap.updateMatrix();
  215. }
  216. uniforms.uvTransform.value.copy( uvScaleMap.matrix );
  217. }
  218. }
  219. function refreshUniformsSprites( uniforms, material ) {
  220. uniforms.diffuse.value.copy( material.color );
  221. uniforms.opacity.value = material.opacity;
  222. uniforms.rotation.value = material.rotation;
  223. if ( material.map ) {
  224. uniforms.map.value = material.map;
  225. }
  226. if ( material.alphaMap ) {
  227. uniforms.alphaMap.value = material.alphaMap;
  228. }
  229. if ( material.alphaTest > 0 ) {
  230. uniforms.alphaTest.value = material.alphaTest;
  231. }
  232. // uv repeat and offset setting priorities
  233. // 1. color map
  234. // 2. alpha map
  235. let uvScaleMap;
  236. if ( material.map ) {
  237. uvScaleMap = material.map;
  238. } else if ( material.alphaMap ) {
  239. uvScaleMap = material.alphaMap;
  240. }
  241. if ( uvScaleMap !== undefined ) {
  242. if ( uvScaleMap.matrixAutoUpdate === true ) {
  243. uvScaleMap.updateMatrix();
  244. }
  245. uniforms.uvTransform.value.copy( uvScaleMap.matrix );
  246. }
  247. }
  248. function refreshUniformsLambert( uniforms, material ) {
  249. if ( material.emissiveMap ) {
  250. uniforms.emissiveMap.value = material.emissiveMap;
  251. }
  252. }
  253. function refreshUniformsPhong( uniforms, material ) {
  254. uniforms.specular.value.copy( material.specular );
  255. uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
  256. if ( material.emissiveMap ) {
  257. uniforms.emissiveMap.value = material.emissiveMap;
  258. }
  259. if ( material.bumpMap ) {
  260. uniforms.bumpMap.value = material.bumpMap;
  261. uniforms.bumpScale.value = material.bumpScale;
  262. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  263. }
  264. if ( material.normalMap ) {
  265. uniforms.normalMap.value = material.normalMap;
  266. uniforms.normalScale.value.copy( material.normalScale );
  267. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  268. }
  269. if ( material.displacementMap ) {
  270. uniforms.displacementMap.value = material.displacementMap;
  271. uniforms.displacementScale.value = material.displacementScale;
  272. uniforms.displacementBias.value = material.displacementBias;
  273. }
  274. }
  275. function refreshUniformsToon( uniforms, material ) {
  276. if ( material.gradientMap ) {
  277. uniforms.gradientMap.value = material.gradientMap;
  278. }
  279. if ( material.emissiveMap ) {
  280. uniforms.emissiveMap.value = material.emissiveMap;
  281. }
  282. if ( material.bumpMap ) {
  283. uniforms.bumpMap.value = material.bumpMap;
  284. uniforms.bumpScale.value = material.bumpScale;
  285. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  286. }
  287. if ( material.normalMap ) {
  288. uniforms.normalMap.value = material.normalMap;
  289. uniforms.normalScale.value.copy( material.normalScale );
  290. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  291. }
  292. if ( material.displacementMap ) {
  293. uniforms.displacementMap.value = material.displacementMap;
  294. uniforms.displacementScale.value = material.displacementScale;
  295. uniforms.displacementBias.value = material.displacementBias;
  296. }
  297. }
  298. function refreshUniformsStandard( uniforms, material ) {
  299. uniforms.roughness.value = material.roughness;
  300. uniforms.metalness.value = material.metalness;
  301. if ( material.roughnessMap ) {
  302. uniforms.roughnessMap.value = material.roughnessMap;
  303. }
  304. if ( material.metalnessMap ) {
  305. uniforms.metalnessMap.value = material.metalnessMap;
  306. }
  307. if ( material.emissiveMap ) {
  308. uniforms.emissiveMap.value = material.emissiveMap;
  309. }
  310. if ( material.bumpMap ) {
  311. uniforms.bumpMap.value = material.bumpMap;
  312. uniforms.bumpScale.value = material.bumpScale;
  313. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  314. }
  315. if ( material.normalMap ) {
  316. uniforms.normalMap.value = material.normalMap;
  317. uniforms.normalScale.value.copy( material.normalScale );
  318. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  319. }
  320. if ( material.displacementMap ) {
  321. uniforms.displacementMap.value = material.displacementMap;
  322. uniforms.displacementScale.value = material.displacementScale;
  323. uniforms.displacementBias.value = material.displacementBias;
  324. }
  325. const envMap = properties.get( material ).envMap;
  326. if ( envMap ) {
  327. //uniforms.envMap.value = material.envMap; // part of uniforms common
  328. uniforms.envMapIntensity.value = material.envMapIntensity;
  329. }
  330. }
  331. function refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {
  332. refreshUniformsStandard( uniforms, material );
  333. uniforms.ior.value = material.ior; // also part of uniforms common
  334. if ( material.sheenTint ) uniforms.sheenTint.value.copy( material.sheenTint );
  335. if ( material.clearcoat > 0 ) {
  336. uniforms.clearcoat.value = material.clearcoat;
  337. uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
  338. if ( material.clearcoatMap ) {
  339. uniforms.clearcoatMap.value = material.clearcoatMap;
  340. }
  341. if ( material.clearcoatRoughnessMap ) {
  342. uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
  343. }
  344. if ( material.clearcoatNormalMap ) {
  345. uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
  346. uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
  347. if ( material.side === BackSide ) {
  348. uniforms.clearcoatNormalScale.value.negate();
  349. }
  350. }
  351. }
  352. uniforms.transmission.value = material.transmission;
  353. if ( material.transmissionMap ) {
  354. uniforms.transmissionMap.value = material.transmissionMap;
  355. }
  356. if ( material.transmission > 0.0 ) {
  357. uniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;
  358. uniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );
  359. }
  360. uniforms.thickness.value = material.thickness;
  361. if ( material.thicknessMap ) {
  362. uniforms.thicknessMap.value = material.thicknessMap;
  363. }
  364. uniforms.attenuationDistance.value = material.attenuationDistance;
  365. uniforms.attenuationTint.value.copy( material.attenuationTint );
  366. uniforms.specularIntensity.value = material.specularIntensity;
  367. uniforms.specularTint.value.copy( material.specularTint );
  368. if ( material.specularIntensityMap ) {
  369. uniforms.specularIntensityMap.value = material.specularIntensityMap;
  370. }
  371. if ( material.specularTintMap ) {
  372. uniforms.specularTintMap.value = material.specularTintMap;
  373. }
  374. }
  375. function refreshUniformsMatcap( uniforms, material ) {
  376. if ( material.matcap ) {
  377. uniforms.matcap.value = material.matcap;
  378. }
  379. if ( material.bumpMap ) {
  380. uniforms.bumpMap.value = material.bumpMap;
  381. uniforms.bumpScale.value = material.bumpScale;
  382. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  383. }
  384. if ( material.normalMap ) {
  385. uniforms.normalMap.value = material.normalMap;
  386. uniforms.normalScale.value.copy( material.normalScale );
  387. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  388. }
  389. if ( material.displacementMap ) {
  390. uniforms.displacementMap.value = material.displacementMap;
  391. uniforms.displacementScale.value = material.displacementScale;
  392. uniforms.displacementBias.value = material.displacementBias;
  393. }
  394. }
  395. function refreshUniformsDepth( uniforms, material ) {
  396. if ( material.displacementMap ) {
  397. uniforms.displacementMap.value = material.displacementMap;
  398. uniforms.displacementScale.value = material.displacementScale;
  399. uniforms.displacementBias.value = material.displacementBias;
  400. }
  401. }
  402. function refreshUniformsDistance( uniforms, material ) {
  403. if ( material.displacementMap ) {
  404. uniforms.displacementMap.value = material.displacementMap;
  405. uniforms.displacementScale.value = material.displacementScale;
  406. uniforms.displacementBias.value = material.displacementBias;
  407. }
  408. uniforms.referencePosition.value.copy( material.referencePosition );
  409. uniforms.nearDistance.value = material.nearDistance;
  410. uniforms.farDistance.value = material.farDistance;
  411. }
  412. function refreshUniformsNormal( uniforms, material ) {
  413. if ( material.bumpMap ) {
  414. uniforms.bumpMap.value = material.bumpMap;
  415. uniforms.bumpScale.value = material.bumpScale;
  416. if ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;
  417. }
  418. if ( material.normalMap ) {
  419. uniforms.normalMap.value = material.normalMap;
  420. uniforms.normalScale.value.copy( material.normalScale );
  421. if ( material.side === BackSide ) uniforms.normalScale.value.negate();
  422. }
  423. if ( material.displacementMap ) {
  424. uniforms.displacementMap.value = material.displacementMap;
  425. uniforms.displacementScale.value = material.displacementScale;
  426. uniforms.displacementBias.value = material.displacementBias;
  427. }
  428. }
  429. return {
  430. refreshFogUniforms: refreshFogUniforms,
  431. refreshMaterialUniforms: refreshMaterialUniforms
  432. };
  433. }
  434. export { WebGLMaterials };