ShaderLib.js 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100
  1. /**
  2. * Webgl Shader Library for three.js
  3. *
  4. * @author alteredq / http://alteredqualia.com/
  5. * @author mrdoob / http://mrdoob.com/
  6. * @author mikael emtinger / http://gomo.se/
  7. */
  8. THREE.ShaderLib = {
  9. 'basic': {
  10. uniforms: THREE.UniformsUtils.merge( [
  11. THREE.UniformsLib[ "common" ],
  12. THREE.UniformsLib[ "aomap" ],
  13. THREE.UniformsLib[ "fog" ],
  14. THREE.UniformsLib[ "shadowmap" ]
  15. ] ),
  16. vertexShader: [
  17. THREE.ShaderChunk[ "common" ],
  18. THREE.ShaderChunk[ "uv_pars_vertex" ],
  19. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  20. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  21. THREE.ShaderChunk[ "color_pars_vertex" ],
  22. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  23. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  24. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  25. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  26. "void main() {",
  27. THREE.ShaderChunk[ "uv_vertex" ],
  28. THREE.ShaderChunk[ "uv2_vertex" ],
  29. THREE.ShaderChunk[ "color_vertex" ],
  30. THREE.ShaderChunk[ "skinbase_vertex" ],
  31. " #ifdef USE_ENVMAP",
  32. THREE.ShaderChunk[ "beginnormal_vertex" ],
  33. THREE.ShaderChunk[ "morphnormal_vertex" ],
  34. THREE.ShaderChunk[ "skinnormal_vertex" ],
  35. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  36. " #endif",
  37. THREE.ShaderChunk[ "begin_vertex" ],
  38. THREE.ShaderChunk[ "morphtarget_vertex" ],
  39. THREE.ShaderChunk[ "skinning_vertex" ],
  40. THREE.ShaderChunk[ "project_vertex" ],
  41. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  42. THREE.ShaderChunk[ "worldpos_vertex" ],
  43. THREE.ShaderChunk[ "envmap_vertex" ],
  44. THREE.ShaderChunk[ "shadowmap_vertex" ],
  45. "}"
  46. ].join( "\n" ),
  47. fragmentShader: [
  48. "uniform vec3 diffuse;",
  49. "uniform float opacity;",
  50. THREE.ShaderChunk[ "common" ],
  51. THREE.ShaderChunk[ "color_pars_fragment" ],
  52. THREE.ShaderChunk[ "uv_pars_fragment" ],
  53. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  54. THREE.ShaderChunk[ "map_pars_fragment" ],
  55. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  56. THREE.ShaderChunk[ "aomap_pars_fragment" ],
  57. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  58. THREE.ShaderChunk[ "fog_pars_fragment" ],
  59. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  60. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  61. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  62. "void main() {",
  63. " vec4 diffuseColor = vec4( diffuse, opacity );",
  64. " vec3 shadowMask = vec3( 1.0 );",
  65. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  66. THREE.ShaderChunk[ "map_fragment" ],
  67. THREE.ShaderChunk[ "color_fragment" ],
  68. THREE.ShaderChunk[ "alphamap_fragment" ],
  69. THREE.ShaderChunk[ "alphatest_fragment" ],
  70. THREE.ShaderChunk[ "specularmap_fragment" ],
  71. " ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), diffuse );",
  72. THREE.ShaderChunk[ "aomap_fragment" ],
  73. THREE.ShaderChunk[ "envmap_fragment" ],
  74. THREE.ShaderChunk[ "shadowmap_fragment" ],
  75. "indirectReflectedLight.diffuse *= shadowMask;",
  76. "vec3 outgoingLight = indirectReflectedLight.diffuse;",
  77. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  78. THREE.ShaderChunk[ "fog_fragment" ],
  79. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  80. "}"
  81. ].join( "\n" )
  82. },
  83. 'lambert': {
  84. uniforms: THREE.UniformsUtils.merge( [
  85. THREE.UniformsLib[ "common" ],
  86. THREE.UniformsLib[ "fog" ],
  87. THREE.UniformsLib[ "lights" ],
  88. THREE.UniformsLib[ "shadowmap" ],
  89. {
  90. "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }
  91. }
  92. ] ),
  93. vertexShader: [
  94. "#define LAMBERT",
  95. "varying vec3 vLightFront;",
  96. "#ifdef DOUBLE_SIDED",
  97. " varying vec3 vLightBack;",
  98. "#endif",
  99. THREE.ShaderChunk[ "common" ],
  100. THREE.ShaderChunk[ "uv_pars_vertex" ],
  101. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  102. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  103. THREE.ShaderChunk[ "bsdfs" ],
  104. THREE.ShaderChunk[ "lights_pars" ],
  105. THREE.ShaderChunk[ "color_pars_vertex" ],
  106. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  107. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  108. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  109. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  110. "void main() {",
  111. THREE.ShaderChunk[ "uv_vertex" ],
  112. THREE.ShaderChunk[ "uv2_vertex" ],
  113. THREE.ShaderChunk[ "color_vertex" ],
  114. THREE.ShaderChunk[ "beginnormal_vertex" ],
  115. THREE.ShaderChunk[ "morphnormal_vertex" ],
  116. THREE.ShaderChunk[ "skinbase_vertex" ],
  117. THREE.ShaderChunk[ "skinnormal_vertex" ],
  118. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  119. THREE.ShaderChunk[ "begin_vertex" ],
  120. THREE.ShaderChunk[ "morphtarget_vertex" ],
  121. THREE.ShaderChunk[ "skinning_vertex" ],
  122. THREE.ShaderChunk[ "project_vertex" ],
  123. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  124. THREE.ShaderChunk[ "worldpos_vertex" ],
  125. THREE.ShaderChunk[ "envmap_vertex" ],
  126. THREE.ShaderChunk[ "lights_lambert_vertex" ],
  127. THREE.ShaderChunk[ "shadowmap_vertex" ],
  128. "}"
  129. ].join( "\n" ),
  130. fragmentShader: [
  131. "uniform vec3 diffuse;",
  132. "uniform vec3 emissive;",
  133. "uniform float opacity;",
  134. "uniform vec3 ambientLightColor;",
  135. "varying vec3 vLightFront;",
  136. "#ifdef DOUBLE_SIDED",
  137. " varying vec3 vLightBack;",
  138. "#endif",
  139. THREE.ShaderChunk[ "common" ],
  140. THREE.ShaderChunk[ "color_pars_fragment" ],
  141. THREE.ShaderChunk[ "uv_pars_fragment" ],
  142. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  143. THREE.ShaderChunk[ "map_pars_fragment" ],
  144. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  145. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  146. THREE.ShaderChunk[ "fog_pars_fragment" ],
  147. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  148. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  149. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  150. "void main() {",
  151. " vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does
  152. " vec4 diffuseColor = vec4( diffuse, opacity );",
  153. " vec3 totalAmbientLight = ambientLightColor;",
  154. " vec3 shadowMask = vec3( 1.0 );",
  155. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  156. THREE.ShaderChunk[ "map_fragment" ],
  157. THREE.ShaderChunk[ "color_fragment" ],
  158. THREE.ShaderChunk[ "alphamap_fragment" ],
  159. THREE.ShaderChunk[ "alphatest_fragment" ],
  160. THREE.ShaderChunk[ "specularmap_fragment" ],
  161. THREE.ShaderChunk[ "shadowmap_fragment" ],
  162. " #ifdef DOUBLE_SIDED",
  163. " if ( gl_FrontFacing )",
  164. " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;",
  165. " else",
  166. " outgoingLight += diffuseColor.rgb * ( vLightBack * shadowMask + totalAmbientLight ) + emissive;",
  167. " #else",
  168. " outgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;",
  169. " #endif",
  170. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  171. THREE.ShaderChunk[ "fog_fragment" ],
  172. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  173. "}"
  174. ].join( "\n" )
  175. },
  176. 'phong': {
  177. uniforms: THREE.UniformsUtils.merge( [
  178. THREE.UniformsLib[ "common" ],
  179. THREE.UniformsLib[ "aomap" ],
  180. THREE.UniformsLib[ "lightmap" ],
  181. THREE.UniformsLib[ "emissivemap" ],
  182. THREE.UniformsLib[ "bumpmap" ],
  183. THREE.UniformsLib[ "normalmap" ],
  184. THREE.UniformsLib[ "displacementmap" ],
  185. THREE.UniformsLib[ "fog" ],
  186. THREE.UniformsLib[ "lights" ],
  187. THREE.UniformsLib[ "shadowmap" ],
  188. {
  189. "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
  190. "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
  191. "shininess": { type: "f", value: 30 }
  192. }
  193. ] ),
  194. vertexShader: [
  195. "#define PHONG",
  196. "varying vec3 vViewPosition;",
  197. "#ifndef FLAT_SHADED",
  198. " varying vec3 vNormal;",
  199. "#endif",
  200. THREE.ShaderChunk[ "common" ],
  201. THREE.ShaderChunk[ "uv_pars_vertex" ],
  202. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  203. THREE.ShaderChunk[ "displacementmap_pars_vertex" ],
  204. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  205. THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
  206. THREE.ShaderChunk[ "color_pars_vertex" ],
  207. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  208. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  209. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  210. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  211. "void main() {",
  212. THREE.ShaderChunk[ "uv_vertex" ],
  213. THREE.ShaderChunk[ "uv2_vertex" ],
  214. THREE.ShaderChunk[ "color_vertex" ],
  215. THREE.ShaderChunk[ "beginnormal_vertex" ],
  216. THREE.ShaderChunk[ "morphnormal_vertex" ],
  217. THREE.ShaderChunk[ "skinbase_vertex" ],
  218. THREE.ShaderChunk[ "skinnormal_vertex" ],
  219. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  220. "#ifndef FLAT_SHADED", // Normal computed with derivatives when FLAT_SHADED
  221. " vNormal = normalize( transformedNormal );",
  222. "#endif",
  223. THREE.ShaderChunk[ "begin_vertex" ],
  224. THREE.ShaderChunk[ "displacementmap_vertex" ],
  225. THREE.ShaderChunk[ "morphtarget_vertex" ],
  226. THREE.ShaderChunk[ "skinning_vertex" ],
  227. THREE.ShaderChunk[ "project_vertex" ],
  228. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  229. " vViewPosition = - mvPosition.xyz;",
  230. THREE.ShaderChunk[ "worldpos_vertex" ],
  231. THREE.ShaderChunk[ "envmap_vertex" ],
  232. THREE.ShaderChunk[ "lights_phong_vertex" ],
  233. THREE.ShaderChunk[ "shadowmap_vertex" ],
  234. "}"
  235. ].join( "\n" ),
  236. fragmentShader: [
  237. "#define PHONG",
  238. "uniform vec3 diffuse;",
  239. "uniform vec3 emissive;",
  240. "uniform vec3 specular;",
  241. "uniform float shininess;",
  242. "uniform float opacity;",
  243. THREE.ShaderChunk[ "common" ],
  244. THREE.ShaderChunk[ "color_pars_fragment" ],
  245. THREE.ShaderChunk[ "uv_pars_fragment" ],
  246. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  247. THREE.ShaderChunk[ "map_pars_fragment" ],
  248. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  249. THREE.ShaderChunk[ "aomap_pars_fragment" ],
  250. THREE.ShaderChunk[ "lightmap_pars_fragment" ],
  251. THREE.ShaderChunk[ "emissivemap_pars_fragment" ],
  252. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  253. THREE.ShaderChunk[ "fog_pars_fragment" ],
  254. THREE.ShaderChunk[ "bsdfs" ],
  255. THREE.ShaderChunk[ "lights_pars" ],
  256. THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
  257. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  258. THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
  259. THREE.ShaderChunk[ "normalmap_pars_fragment" ],
  260. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  261. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  262. "void main() {",
  263. " vec4 diffuseColor = vec4( diffuse, opacity );",
  264. " ReflectedLight directReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );",
  265. " ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );",
  266. " vec3 totalEmissiveLight = emissive;",
  267. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  268. THREE.ShaderChunk[ "map_fragment" ],
  269. THREE.ShaderChunk[ "color_fragment" ],
  270. THREE.ShaderChunk[ "alphamap_fragment" ],
  271. THREE.ShaderChunk[ "alphatest_fragment" ],
  272. THREE.ShaderChunk[ "specularmap_fragment" ],
  273. THREE.ShaderChunk[ "normal_phong_fragment" ],
  274. THREE.ShaderChunk[ "emissivemap_fragment" ],
  275. // accumulation
  276. THREE.ShaderChunk[ "lights_phong_fragment" ],
  277. THREE.ShaderChunk[ "lights_template" ],
  278. THREE.ShaderChunk[ "lightmap_fragment" ],
  279. // modulation
  280. THREE.ShaderChunk[ "envmap_fragment" ],
  281. THREE.ShaderChunk[ "aomap_fragment" ],
  282. "vec3 shadowMask = vec3( 1.0 );",
  283. THREE.ShaderChunk[ "shadowmap_fragment" ],
  284. "directReflectedLight.diffuse *= shadowMask;",
  285. "directReflectedLight.specular *= shadowMask;",
  286. "#ifdef METAL",
  287. " vec3 outgoingLight = ( directReflectedLight.diffuse + indirectReflectedLight.diffuse ) * specular + directReflectedLight.specular + indirectReflectedLight.specular + totalEmissiveLight;",
  288. "#else",
  289. " vec3 outgoingLight = ( directReflectedLight.diffuse + indirectReflectedLight.diffuse ) + directReflectedLight.specular + indirectReflectedLight.specular + totalEmissiveLight;",
  290. "#endif",
  291. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  292. THREE.ShaderChunk[ "fog_fragment" ],
  293. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  294. "}"
  295. ].join( "\n" )
  296. },
  297. 'physical': {
  298. uniforms: THREE.UniformsUtils.merge( [
  299. THREE.UniformsLib[ "common" ],
  300. THREE.UniformsLib[ "aomap" ],
  301. THREE.UniformsLib[ "lightmap" ],
  302. THREE.UniformsLib[ "emissivemap" ],
  303. THREE.UniformsLib[ "bumpmap" ],
  304. THREE.UniformsLib[ "normalmap" ],
  305. THREE.UniformsLib[ "displacementmap" ],
  306. THREE.UniformsLib[ "roughnessmap" ],
  307. THREE.UniformsLib[ "reflectivitymap" ],
  308. THREE.UniformsLib[ "metalnessmap" ],
  309. THREE.UniformsLib[ "fog" ],
  310. THREE.UniformsLib[ "lights" ],
  311. THREE.UniformsLib[ "shadowmap" ],
  312. {
  313. "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
  314. "roughness": { type: "f", value: 0.5 },
  315. "metalness": { type: "f", value: 0 },
  316. "envMapIntensity" : { type: "f", value: 1 } // temporary
  317. }
  318. ] ),
  319. vertexShader: [
  320. "#define PHYSICAL",
  321. "varying vec3 vViewPosition;",
  322. "#ifndef FLAT_SHADED",
  323. " varying vec3 vNormal;",
  324. "#endif",
  325. THREE.ShaderChunk[ "common" ],
  326. THREE.ShaderChunk[ "uv_pars_vertex" ],
  327. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  328. THREE.ShaderChunk[ "displacementmap_pars_vertex" ],
  329. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  330. THREE.ShaderChunk[ "lights_phong_pars_vertex" ], // use phong chunk for now
  331. THREE.ShaderChunk[ "color_pars_vertex" ],
  332. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  333. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  334. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  335. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  336. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  337. "void main() {", // PHYSICAL
  338. THREE.ShaderChunk[ "uv_vertex" ],
  339. THREE.ShaderChunk[ "uv2_vertex" ],
  340. THREE.ShaderChunk[ "color_vertex" ],
  341. THREE.ShaderChunk[ "beginnormal_vertex" ],
  342. THREE.ShaderChunk[ "morphnormal_vertex" ],
  343. THREE.ShaderChunk[ "skinbase_vertex" ],
  344. THREE.ShaderChunk[ "skinnormal_vertex" ],
  345. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  346. "#ifndef FLAT_SHADED", // Normal computed with derivatives when FLAT_SHADED
  347. " vNormal = normalize( transformedNormal );",
  348. "#endif",
  349. THREE.ShaderChunk[ "begin_vertex" ],
  350. THREE.ShaderChunk[ "displacementmap_vertex" ],
  351. THREE.ShaderChunk[ "morphtarget_vertex" ],
  352. THREE.ShaderChunk[ "skinning_vertex" ],
  353. THREE.ShaderChunk[ "project_vertex" ],
  354. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  355. " vViewPosition = - mvPosition.xyz;",
  356. THREE.ShaderChunk[ "worldpos_vertex" ],
  357. THREE.ShaderChunk[ "envmap_vertex" ],
  358. THREE.ShaderChunk[ "lights_phong_vertex" ], // use phong chunk for now
  359. THREE.ShaderChunk[ "shadowmap_vertex" ],
  360. "}"
  361. ].join( "\n" ),
  362. fragmentShader: [
  363. "#define PHYSICAL",
  364. "uniform vec3 diffuse;",
  365. "uniform vec3 emissive;",
  366. "uniform float roughness;",
  367. "uniform float metalness;",
  368. "uniform float opacity;",
  369. "uniform float envMapIntensity;", // temporary
  370. THREE.ShaderChunk[ "common" ],
  371. THREE.ShaderChunk[ "color_pars_fragment" ],
  372. THREE.ShaderChunk[ "uv_pars_fragment" ],
  373. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  374. THREE.ShaderChunk[ "map_pars_fragment" ],
  375. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  376. THREE.ShaderChunk[ "aomap_pars_fragment" ],
  377. THREE.ShaderChunk[ "lightmap_pars_fragment" ],
  378. THREE.ShaderChunk[ "emissivemap_pars_fragment" ],
  379. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  380. THREE.ShaderChunk[ "fog_pars_fragment" ],
  381. THREE.ShaderChunk[ "bsdfs" ],
  382. THREE.ShaderChunk[ "lights_pars" ],
  383. THREE.ShaderChunk[ "lights_physical_pars_fragment" ], // use phong chunk for now
  384. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  385. THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
  386. THREE.ShaderChunk[ "normalmap_pars_fragment" ],
  387. THREE.ShaderChunk[ "roughnessmap_pars_fragment" ],
  388. //THREE.ShaderChunk[ "reflectivitymap_pars_fragment" ],
  389. THREE.ShaderChunk[ "metalnessmap_pars_fragment" ],
  390. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  391. "void main() {",
  392. " vec4 diffuseColor = vec4( diffuse, opacity );",
  393. " ReflectedLight directReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );",
  394. " ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );",
  395. " vec3 totalEmissiveLight = emissive;",
  396. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  397. THREE.ShaderChunk[ "map_fragment" ],
  398. THREE.ShaderChunk[ "color_fragment" ],
  399. THREE.ShaderChunk[ "alphamap_fragment" ],
  400. THREE.ShaderChunk[ "alphatest_fragment" ],
  401. THREE.ShaderChunk[ "specularmap_fragment" ],
  402. THREE.ShaderChunk[ "roughnessmap_fragment" ],
  403. //THREE.ShaderChunk[ "reflectivitymap_fragment" ],
  404. THREE.ShaderChunk[ "metalnessmap_fragment" ],
  405. THREE.ShaderChunk[ "normal_phong_fragment" ], // use phong chunk for now
  406. THREE.ShaderChunk[ "emissivemap_fragment" ],
  407. // accumulation
  408. THREE.ShaderChunk[ "lights_physical_fragment" ],
  409. THREE.ShaderChunk[ "lights_template" ],
  410. THREE.ShaderChunk[ "lightmap_fragment" ],
  411. THREE.ShaderChunk[ "envmap_physical_fragment" ],
  412. // modulation
  413. THREE.ShaderChunk[ "aomap_fragment" ],
  414. "vec3 shadowMask = vec3( 1.0 );",
  415. THREE.ShaderChunk[ "shadowmap_fragment" ],
  416. "directReflectedLight.diffuse *= shadowMask;",
  417. "directReflectedLight.specular *= shadowMask;",
  418. "vec3 outgoingLight = directReflectedLight.diffuse + indirectReflectedLight.diffuse + directReflectedLight.specular + indirectReflectedLight.specular + totalEmissiveLight;",
  419. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  420. THREE.ShaderChunk[ "fog_fragment" ],
  421. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  422. "}"
  423. ].join( "\n" )
  424. },
  425. 'points': {
  426. uniforms: THREE.UniformsUtils.merge( [
  427. THREE.UniformsLib[ "points" ],
  428. THREE.UniformsLib[ "shadowmap" ]
  429. ] ),
  430. vertexShader: [
  431. "uniform float size;",
  432. "uniform float scale;",
  433. THREE.ShaderChunk[ "common" ],
  434. THREE.ShaderChunk[ "color_pars_vertex" ],
  435. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  436. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  437. "void main() {",
  438. THREE.ShaderChunk[ "color_vertex" ],
  439. " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  440. " #ifdef USE_SIZEATTENUATION",
  441. " gl_PointSize = size * ( scale / length( mvPosition.xyz ) );",
  442. " #else",
  443. " gl_PointSize = size;",
  444. " #endif",
  445. " gl_Position = projectionMatrix * mvPosition;",
  446. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  447. THREE.ShaderChunk[ "worldpos_vertex" ],
  448. THREE.ShaderChunk[ "shadowmap_vertex" ],
  449. "}"
  450. ].join( "\n" ),
  451. fragmentShader: [
  452. "uniform vec3 psColor;",
  453. "uniform float opacity;",
  454. THREE.ShaderChunk[ "common" ],
  455. THREE.ShaderChunk[ "color_pars_fragment" ],
  456. THREE.ShaderChunk[ "map_particle_pars_fragment" ],
  457. THREE.ShaderChunk[ "fog_pars_fragment" ],
  458. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  459. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  460. "void main() {",
  461. " vec3 outgoingLight = vec3( 0.0 );",
  462. " vec4 diffuseColor = vec4( psColor, opacity );",
  463. " vec3 shadowMask = vec3( 1.0 );",
  464. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  465. THREE.ShaderChunk[ "map_particle_fragment" ],
  466. THREE.ShaderChunk[ "color_fragment" ],
  467. THREE.ShaderChunk[ "alphatest_fragment" ],
  468. THREE.ShaderChunk[ "shadowmap_fragment" ],
  469. " outgoingLight = diffuseColor.rgb * shadowMask;",
  470. THREE.ShaderChunk[ "fog_fragment" ],
  471. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  472. "}"
  473. ].join( "\n" )
  474. },
  475. 'dashed': {
  476. uniforms: THREE.UniformsUtils.merge( [
  477. THREE.UniformsLib[ "common" ],
  478. THREE.UniformsLib[ "fog" ],
  479. {
  480. "scale" : { type: "f", value: 1 },
  481. "dashSize" : { type: "f", value: 1 },
  482. "totalSize": { type: "f", value: 2 }
  483. }
  484. ] ),
  485. vertexShader: [
  486. "uniform float scale;",
  487. "attribute float lineDistance;",
  488. "varying float vLineDistance;",
  489. THREE.ShaderChunk[ "common" ],
  490. THREE.ShaderChunk[ "color_pars_vertex" ],
  491. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  492. "void main() {",
  493. THREE.ShaderChunk[ "color_vertex" ],
  494. " vLineDistance = scale * lineDistance;",
  495. " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  496. " gl_Position = projectionMatrix * mvPosition;",
  497. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  498. "}"
  499. ].join( "\n" ),
  500. fragmentShader: [
  501. "uniform vec3 diffuse;",
  502. "uniform float opacity;",
  503. "uniform float dashSize;",
  504. "uniform float totalSize;",
  505. "varying float vLineDistance;",
  506. THREE.ShaderChunk[ "common" ],
  507. THREE.ShaderChunk[ "color_pars_fragment" ],
  508. THREE.ShaderChunk[ "fog_pars_fragment" ],
  509. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  510. "void main() {",
  511. " if ( mod( vLineDistance, totalSize ) > dashSize ) {",
  512. " discard;",
  513. " }",
  514. " vec3 outgoingLight = vec3( 0.0 );",
  515. " vec4 diffuseColor = vec4( diffuse, opacity );",
  516. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  517. THREE.ShaderChunk[ "color_fragment" ],
  518. " outgoingLight = diffuseColor.rgb;", // simple shader
  519. THREE.ShaderChunk[ "fog_fragment" ],
  520. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  521. "}"
  522. ].join( "\n" )
  523. },
  524. 'depth': {
  525. uniforms: {
  526. "mNear": { type: "f", value: 1.0 },
  527. "mFar" : { type: "f", value: 2000.0 },
  528. "opacity" : { type: "f", value: 1.0 }
  529. },
  530. vertexShader: [
  531. THREE.ShaderChunk[ "common" ],
  532. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  533. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  534. "void main() {",
  535. THREE.ShaderChunk[ "begin_vertex" ],
  536. THREE.ShaderChunk[ "morphtarget_vertex" ],
  537. THREE.ShaderChunk[ "project_vertex" ],
  538. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  539. "}"
  540. ].join( "\n" ),
  541. fragmentShader: [
  542. "uniform float mNear;",
  543. "uniform float mFar;",
  544. "uniform float opacity;",
  545. THREE.ShaderChunk[ "common" ],
  546. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  547. "void main() {",
  548. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  549. " #ifdef USE_LOGDEPTHBUF_EXT",
  550. " float depth = gl_FragDepthEXT / gl_FragCoord.w;",
  551. " #else",
  552. " float depth = gl_FragCoord.z / gl_FragCoord.w;",
  553. " #endif",
  554. " float color = 1.0 - smoothstep( mNear, mFar, depth );",
  555. " gl_FragColor = vec4( vec3( color ), opacity );",
  556. "}"
  557. ].join( "\n" )
  558. },
  559. 'normal': {
  560. uniforms: {
  561. "opacity" : { type: "f", value: 1.0 }
  562. },
  563. vertexShader: [
  564. "varying vec3 vNormal;",
  565. THREE.ShaderChunk[ "common" ],
  566. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  567. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  568. "void main() {",
  569. " vNormal = normalize( normalMatrix * normal );",
  570. THREE.ShaderChunk[ "begin_vertex" ],
  571. THREE.ShaderChunk[ "morphtarget_vertex" ],
  572. THREE.ShaderChunk[ "project_vertex" ],
  573. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  574. "}"
  575. ].join( "\n" ),
  576. fragmentShader: [
  577. "uniform float opacity;",
  578. "varying vec3 vNormal;",
  579. THREE.ShaderChunk[ "common" ],
  580. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  581. "void main() {",
  582. " gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
  583. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  584. "}"
  585. ].join( "\n" )
  586. },
  587. /* -------------------------------------------------------------------------
  588. // Cube map shader
  589. ------------------------------------------------------------------------- */
  590. 'cube': {
  591. uniforms: { "tCube": { type: "t", value: null },
  592. "tFlip": { type: "f", value: - 1 } },
  593. vertexShader: [
  594. "varying vec3 vWorldPosition;",
  595. THREE.ShaderChunk[ "common" ],
  596. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  597. "void main() {",
  598. " vWorldPosition = transformDirection( position, modelMatrix );",
  599. " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  600. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  601. "}"
  602. ].join( "\n" ),
  603. fragmentShader: [
  604. "uniform samplerCube tCube;",
  605. "uniform float tFlip;",
  606. "varying vec3 vWorldPosition;",
  607. THREE.ShaderChunk[ "common" ],
  608. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  609. "void main() {",
  610. " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
  611. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  612. "}"
  613. ].join( "\n" )
  614. },
  615. /* -------------------------------------------------------------------------
  616. // Cube map shader
  617. ------------------------------------------------------------------------- */
  618. 'equirect': {
  619. uniforms: { "tEquirect": { type: "t", value: null },
  620. "tFlip": { type: "f", value: - 1 } },
  621. vertexShader: [
  622. "varying vec3 vWorldPosition;",
  623. THREE.ShaderChunk[ "common" ],
  624. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  625. "void main() {",
  626. " vWorldPosition = transformDirection( position, modelMatrix );",
  627. " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  628. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  629. "}"
  630. ].join( "\n" ),
  631. fragmentShader: [
  632. "uniform sampler2D tEquirect;",
  633. "uniform float tFlip;",
  634. "varying vec3 vWorldPosition;",
  635. THREE.ShaderChunk[ "common" ],
  636. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  637. "void main() {",
  638. // " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
  639. "vec3 direction = normalize( vWorldPosition );",
  640. "vec2 sampleUV;",
  641. "sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );",
  642. "sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;",
  643. "gl_FragColor = texture2D( tEquirect, sampleUV );",
  644. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  645. "}"
  646. ].join( "\n" )
  647. },
  648. /* Depth encoding into RGBA texture
  649. *
  650. * based on SpiderGL shadow map example
  651. * http://spidergl.org/example.php?id=6
  652. *
  653. * originally from
  654. * http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD
  655. *
  656. * see also
  657. * http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
  658. */
  659. 'depthRGBA': {
  660. uniforms: {},
  661. vertexShader: [
  662. THREE.ShaderChunk[ "common" ],
  663. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  664. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  665. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  666. "void main() {",
  667. THREE.ShaderChunk[ "skinbase_vertex" ],
  668. THREE.ShaderChunk[ "begin_vertex" ],
  669. THREE.ShaderChunk[ "morphtarget_vertex" ],
  670. THREE.ShaderChunk[ "skinning_vertex" ],
  671. THREE.ShaderChunk[ "project_vertex" ],
  672. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  673. "}"
  674. ].join( "\n" ),
  675. fragmentShader: [
  676. THREE.ShaderChunk[ "common" ],
  677. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  678. "vec4 pack_depth( const in float depth ) {",
  679. " const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
  680. " const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
  681. " vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );", // " vec4 res = fract( depth * bit_shift );",
  682. " res -= res.xxyz * bit_mask;",
  683. " return res;",
  684. "}",
  685. "void main() {",
  686. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  687. " #ifdef USE_LOGDEPTHBUF_EXT",
  688. " gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );",
  689. " #else",
  690. " gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );",
  691. " #endif",
  692. //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );",
  693. //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );",
  694. //"gl_FragData[ 0 ] = pack_depth( z );",
  695. //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );",
  696. "}"
  697. ].join( "\n" )
  698. },
  699. 'distanceRGBA': {
  700. uniforms: {
  701. "lightPos": { type: "v3", value: new THREE.Vector3( 0, 0, 0 ) }
  702. },
  703. vertexShader: [
  704. "varying vec4 vWorldPosition;",
  705. THREE.ShaderChunk[ "common" ],
  706. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  707. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  708. "void main() {",
  709. THREE.ShaderChunk[ "skinbase_vertex" ],
  710. THREE.ShaderChunk[ "begin_vertex" ],
  711. THREE.ShaderChunk[ "morphtarget_vertex" ],
  712. THREE.ShaderChunk[ "skinning_vertex" ],
  713. THREE.ShaderChunk[ "project_vertex" ],
  714. THREE.ShaderChunk[ "worldpos_vertex" ],
  715. "vWorldPosition = worldPosition;",
  716. "}"
  717. ].join( "\n" ),
  718. fragmentShader: [
  719. "uniform vec3 lightPos;",
  720. "varying vec4 vWorldPosition;",
  721. THREE.ShaderChunk[ "common" ],
  722. "vec4 pack1K ( float depth ) {",
  723. " depth /= 1000.0;",
  724. " const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
  725. " const vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
  726. " vec4 res = fract( depth * bitSh );",
  727. " res -= res.xxyz * bitMsk;",
  728. " return res; ",
  729. "}",
  730. "float unpack1K ( vec4 color ) {",
  731. " const vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );",
  732. " return dot( color, bitSh ) * 1000.0;",
  733. "}",
  734. "void main () {",
  735. " gl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );",
  736. "}"
  737. ].join( "\n" )
  738. }
  739. };