ShaderLib.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  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. " vec3 outgoingLight = vec3( 0.0 );",
  64. " vec4 diffuseColor = vec4( diffuse, opacity );",
  65. " vec3 totalAmbientLight = vec3( 1.0 );", // hardwired
  66. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  67. THREE.ShaderChunk[ "map_fragment" ],
  68. THREE.ShaderChunk[ "color_fragment" ],
  69. THREE.ShaderChunk[ "alphamap_fragment" ],
  70. THREE.ShaderChunk[ "alphatest_fragment" ],
  71. THREE.ShaderChunk[ "specularmap_fragment" ],
  72. THREE.ShaderChunk[ "aomap_fragment" ],
  73. " outgoingLight = diffuseColor.rgb * totalAmbientLight;", // simple shader
  74. THREE.ShaderChunk[ "envmap_fragment" ],
  75. THREE.ShaderChunk[ "shadowmap_fragment" ], // TODO: Shadows on an otherwise unlit surface doesn't make sense.
  76. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  77. THREE.ShaderChunk[ "fog_fragment" ],
  78. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  79. "}"
  80. ].join( "\n" )
  81. },
  82. 'lambert': {
  83. uniforms: THREE.UniformsUtils.merge( [
  84. THREE.UniformsLib[ "common" ],
  85. THREE.UniformsLib[ "fog" ],
  86. THREE.UniformsLib[ "lights" ],
  87. THREE.UniformsLib[ "shadowmap" ],
  88. {
  89. "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) }
  90. }
  91. ] ),
  92. vertexShader: [
  93. "#define LAMBERT",
  94. "varying vec3 vLightFront;",
  95. "#ifdef DOUBLE_SIDED",
  96. " varying vec3 vLightBack;",
  97. "#endif",
  98. THREE.ShaderChunk[ "common" ],
  99. THREE.ShaderChunk[ "uv_pars_vertex" ],
  100. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  101. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  102. THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
  103. THREE.ShaderChunk[ "color_pars_vertex" ],
  104. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  105. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  106. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  107. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  108. "void main() {",
  109. THREE.ShaderChunk[ "uv_vertex" ],
  110. THREE.ShaderChunk[ "uv2_vertex" ],
  111. THREE.ShaderChunk[ "color_vertex" ],
  112. THREE.ShaderChunk[ "beginnormal_vertex" ],
  113. THREE.ShaderChunk[ "morphnormal_vertex" ],
  114. THREE.ShaderChunk[ "skinbase_vertex" ],
  115. THREE.ShaderChunk[ "skinnormal_vertex" ],
  116. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  117. THREE.ShaderChunk[ "begin_vertex" ],
  118. THREE.ShaderChunk[ "morphtarget_vertex" ],
  119. THREE.ShaderChunk[ "skinning_vertex" ],
  120. THREE.ShaderChunk[ "project_vertex" ],
  121. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  122. THREE.ShaderChunk[ "worldpos_vertex" ],
  123. THREE.ShaderChunk[ "envmap_vertex" ],
  124. THREE.ShaderChunk[ "lights_lambert_vertex" ],
  125. THREE.ShaderChunk[ "shadowmap_vertex" ],
  126. "}"
  127. ].join( "\n" ),
  128. fragmentShader: [
  129. "uniform vec3 diffuse;",
  130. "uniform vec3 emissive;",
  131. "uniform float opacity;",
  132. "varying vec3 vLightFront;",
  133. "#ifdef DOUBLE_SIDED",
  134. " varying vec3 vLightBack;",
  135. "#endif",
  136. THREE.ShaderChunk[ "common" ],
  137. THREE.ShaderChunk[ "color_pars_fragment" ],
  138. THREE.ShaderChunk[ "uv_pars_fragment" ],
  139. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  140. THREE.ShaderChunk[ "map_pars_fragment" ],
  141. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  142. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  143. THREE.ShaderChunk[ "fog_pars_fragment" ],
  144. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  145. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  146. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  147. "void main() {",
  148. " vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does
  149. " vec4 diffuseColor = vec4( diffuse, opacity );",
  150. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  151. THREE.ShaderChunk[ "map_fragment" ],
  152. THREE.ShaderChunk[ "color_fragment" ],
  153. THREE.ShaderChunk[ "alphamap_fragment" ],
  154. THREE.ShaderChunk[ "alphatest_fragment" ],
  155. THREE.ShaderChunk[ "specularmap_fragment" ],
  156. " #ifdef DOUBLE_SIDED",
  157. " if ( gl_FrontFacing )",
  158. " outgoingLight += diffuseColor.rgb * vLightFront + emissive;",
  159. " else",
  160. " outgoingLight += diffuseColor.rgb * vLightBack + emissive;",
  161. " #else",
  162. " outgoingLight += diffuseColor.rgb * vLightFront + emissive;",
  163. " #endif",
  164. THREE.ShaderChunk[ "envmap_fragment" ],
  165. THREE.ShaderChunk[ "shadowmap_fragment" ],
  166. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  167. THREE.ShaderChunk[ "fog_fragment" ],
  168. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  169. "}"
  170. ].join( "\n" )
  171. },
  172. 'phong': {
  173. uniforms: THREE.UniformsUtils.merge( [
  174. THREE.UniformsLib[ "common" ],
  175. THREE.UniformsLib[ "aomap" ],
  176. THREE.UniformsLib[ "lightmap" ],
  177. THREE.UniformsLib[ "emissivemap" ],
  178. THREE.UniformsLib[ "bumpmap" ],
  179. THREE.UniformsLib[ "normalmap" ],
  180. THREE.UniformsLib[ "displacementmap" ],
  181. THREE.UniformsLib[ "fog" ],
  182. THREE.UniformsLib[ "lights" ],
  183. THREE.UniformsLib[ "shadowmap" ],
  184. {
  185. "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
  186. "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
  187. "shininess": { type: "f", value: 30 }
  188. }
  189. ] ),
  190. vertexShader: [
  191. "#define PHONG",
  192. "varying vec3 vViewPosition;",
  193. "#ifndef FLAT_SHADED",
  194. " varying vec3 vNormal;",
  195. "#endif",
  196. THREE.ShaderChunk[ "common" ],
  197. THREE.ShaderChunk[ "uv_pars_vertex" ],
  198. THREE.ShaderChunk[ "uv2_pars_vertex" ],
  199. THREE.ShaderChunk[ "displacementmap_pars_vertex" ],
  200. THREE.ShaderChunk[ "envmap_pars_vertex" ],
  201. THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
  202. THREE.ShaderChunk[ "color_pars_vertex" ],
  203. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  204. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  205. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  206. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  207. "void main() {",
  208. THREE.ShaderChunk[ "uv_vertex" ],
  209. THREE.ShaderChunk[ "uv2_vertex" ],
  210. THREE.ShaderChunk[ "color_vertex" ],
  211. THREE.ShaderChunk[ "beginnormal_vertex" ],
  212. THREE.ShaderChunk[ "morphnormal_vertex" ],
  213. THREE.ShaderChunk[ "skinbase_vertex" ],
  214. THREE.ShaderChunk[ "skinnormal_vertex" ],
  215. THREE.ShaderChunk[ "defaultnormal_vertex" ],
  216. "#ifndef FLAT_SHADED", // Normal computed with derivatives when FLAT_SHADED
  217. " vNormal = normalize( transformedNormal );",
  218. "#endif",
  219. THREE.ShaderChunk[ "begin_vertex" ],
  220. THREE.ShaderChunk[ "displacementmap_vertex" ],
  221. THREE.ShaderChunk[ "morphtarget_vertex" ],
  222. THREE.ShaderChunk[ "skinning_vertex" ],
  223. THREE.ShaderChunk[ "project_vertex" ],
  224. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  225. " vViewPosition = - mvPosition.xyz;",
  226. THREE.ShaderChunk[ "worldpos_vertex" ],
  227. THREE.ShaderChunk[ "envmap_vertex" ],
  228. THREE.ShaderChunk[ "lights_phong_vertex" ],
  229. THREE.ShaderChunk[ "shadowmap_vertex" ],
  230. "}"
  231. ].join( "\n" ),
  232. fragmentShader: [
  233. "#define PHONG",
  234. "uniform vec3 diffuse;",
  235. "uniform vec3 emissive;",
  236. "uniform vec3 specular;",
  237. "uniform float shininess;",
  238. "uniform float opacity;",
  239. THREE.ShaderChunk[ "common" ],
  240. THREE.ShaderChunk[ "color_pars_fragment" ],
  241. THREE.ShaderChunk[ "uv_pars_fragment" ],
  242. THREE.ShaderChunk[ "uv2_pars_fragment" ],
  243. THREE.ShaderChunk[ "map_pars_fragment" ],
  244. THREE.ShaderChunk[ "alphamap_pars_fragment" ],
  245. THREE.ShaderChunk[ "aomap_pars_fragment" ],
  246. THREE.ShaderChunk[ "lightmap_pars_fragment" ],
  247. THREE.ShaderChunk[ "emissivemap_pars_fragment" ],
  248. THREE.ShaderChunk[ "envmap_pars_fragment" ],
  249. THREE.ShaderChunk[ "fog_pars_fragment" ],
  250. THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
  251. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  252. THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
  253. THREE.ShaderChunk[ "normalmap_pars_fragment" ],
  254. THREE.ShaderChunk[ "specularmap_pars_fragment" ],
  255. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  256. "void main() {",
  257. " vec3 outgoingLight = vec3( 0.0 );",
  258. " vec4 diffuseColor = vec4( diffuse, opacity );",
  259. " vec3 totalAmbientLight = ambientLightColor;",
  260. " vec3 totalEmissiveLight = emissive;",
  261. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  262. THREE.ShaderChunk[ "map_fragment" ],
  263. THREE.ShaderChunk[ "color_fragment" ],
  264. THREE.ShaderChunk[ "alphamap_fragment" ],
  265. THREE.ShaderChunk[ "alphatest_fragment" ],
  266. THREE.ShaderChunk[ "specularmap_fragment" ],
  267. THREE.ShaderChunk[ "normal_phong_fragment" ],
  268. THREE.ShaderChunk[ "lightmap_fragment" ],
  269. THREE.ShaderChunk[ "hemilight_fragment" ],
  270. THREE.ShaderChunk[ "aomap_fragment" ],
  271. THREE.ShaderChunk[ "emissivemap_fragment" ],
  272. THREE.ShaderChunk[ "lights_phong_fragment" ],
  273. THREE.ShaderChunk[ "envmap_fragment" ],
  274. THREE.ShaderChunk[ "shadowmap_fragment" ],
  275. THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
  276. THREE.ShaderChunk[ "fog_fragment" ],
  277. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  278. "}"
  279. ].join( "\n" )
  280. },
  281. 'points': {
  282. uniforms: THREE.UniformsUtils.merge( [
  283. THREE.UniformsLib[ "points" ],
  284. THREE.UniformsLib[ "shadowmap" ]
  285. ] ),
  286. vertexShader: [
  287. "uniform float size;",
  288. "uniform float scale;",
  289. THREE.ShaderChunk[ "common" ],
  290. THREE.ShaderChunk[ "color_pars_vertex" ],
  291. THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
  292. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  293. "void main() {",
  294. THREE.ShaderChunk[ "color_vertex" ],
  295. " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  296. " #ifdef USE_SIZEATTENUATION",
  297. " gl_PointSize = size * ( scale / length( mvPosition.xyz ) );",
  298. " #else",
  299. " gl_PointSize = size;",
  300. " #endif",
  301. " gl_Position = projectionMatrix * mvPosition;",
  302. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  303. THREE.ShaderChunk[ "worldpos_vertex" ],
  304. THREE.ShaderChunk[ "shadowmap_vertex" ],
  305. "}"
  306. ].join( "\n" ),
  307. fragmentShader: [
  308. "uniform vec3 psColor;",
  309. "uniform float opacity;",
  310. THREE.ShaderChunk[ "common" ],
  311. THREE.ShaderChunk[ "color_pars_fragment" ],
  312. THREE.ShaderChunk[ "map_particle_pars_fragment" ],
  313. THREE.ShaderChunk[ "fog_pars_fragment" ],
  314. THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
  315. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  316. "void main() {",
  317. " vec3 outgoingLight = vec3( 0.0 );",
  318. " vec4 diffuseColor = vec4( psColor, opacity );",
  319. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  320. THREE.ShaderChunk[ "map_particle_fragment" ],
  321. THREE.ShaderChunk[ "color_fragment" ],
  322. THREE.ShaderChunk[ "alphatest_fragment" ],
  323. " outgoingLight = diffuseColor.rgb;", // simple shader
  324. THREE.ShaderChunk[ "shadowmap_fragment" ],
  325. THREE.ShaderChunk[ "fog_fragment" ],
  326. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  327. "}"
  328. ].join( "\n" )
  329. },
  330. 'dashed': {
  331. uniforms: THREE.UniformsUtils.merge( [
  332. THREE.UniformsLib[ "common" ],
  333. THREE.UniformsLib[ "fog" ],
  334. {
  335. "scale" : { type: "f", value: 1 },
  336. "dashSize" : { type: "f", value: 1 },
  337. "totalSize": { type: "f", value: 2 }
  338. }
  339. ] ),
  340. vertexShader: [
  341. "uniform float scale;",
  342. "attribute float lineDistance;",
  343. "varying float vLineDistance;",
  344. THREE.ShaderChunk[ "common" ],
  345. THREE.ShaderChunk[ "color_pars_vertex" ],
  346. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  347. "void main() {",
  348. THREE.ShaderChunk[ "color_vertex" ],
  349. " vLineDistance = scale * lineDistance;",
  350. " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  351. " gl_Position = projectionMatrix * mvPosition;",
  352. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  353. "}"
  354. ].join( "\n" ),
  355. fragmentShader: [
  356. "uniform vec3 diffuse;",
  357. "uniform float opacity;",
  358. "uniform float dashSize;",
  359. "uniform float totalSize;",
  360. "varying float vLineDistance;",
  361. THREE.ShaderChunk[ "common" ],
  362. THREE.ShaderChunk[ "color_pars_fragment" ],
  363. THREE.ShaderChunk[ "fog_pars_fragment" ],
  364. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  365. "void main() {",
  366. " if ( mod( vLineDistance, totalSize ) > dashSize ) {",
  367. " discard;",
  368. " }",
  369. " vec3 outgoingLight = vec3( 0.0 );",
  370. " vec4 diffuseColor = vec4( diffuse, opacity );",
  371. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  372. THREE.ShaderChunk[ "color_fragment" ],
  373. " outgoingLight = diffuseColor.rgb;", // simple shader
  374. THREE.ShaderChunk[ "fog_fragment" ],
  375. " gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
  376. "}"
  377. ].join( "\n" )
  378. },
  379. 'depth': {
  380. uniforms: {
  381. "mNear": { type: "f", value: 1.0 },
  382. "mFar" : { type: "f", value: 2000.0 },
  383. "opacity" : { type: "f", value: 1.0 }
  384. },
  385. vertexShader: [
  386. THREE.ShaderChunk[ "common" ],
  387. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  388. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  389. "void main() {",
  390. THREE.ShaderChunk[ "begin_vertex" ],
  391. THREE.ShaderChunk[ "morphtarget_vertex" ],
  392. THREE.ShaderChunk[ "project_vertex" ],
  393. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  394. "}"
  395. ].join( "\n" ),
  396. fragmentShader: [
  397. "uniform float mNear;",
  398. "uniform float mFar;",
  399. "uniform float opacity;",
  400. THREE.ShaderChunk[ "common" ],
  401. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  402. "void main() {",
  403. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  404. " #ifdef USE_LOGDEPTHBUF_EXT",
  405. " float depth = gl_FragDepthEXT / gl_FragCoord.w;",
  406. " #else",
  407. " float depth = gl_FragCoord.z / gl_FragCoord.w;",
  408. " #endif",
  409. " float color = 1.0 - smoothstep( mNear, mFar, depth );",
  410. " gl_FragColor = vec4( vec3( color ), opacity );",
  411. "}"
  412. ].join( "\n" )
  413. },
  414. 'normal': {
  415. uniforms: {
  416. "opacity" : { type: "f", value: 1.0 }
  417. },
  418. vertexShader: [
  419. "varying vec3 vNormal;",
  420. THREE.ShaderChunk[ "common" ],
  421. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  422. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  423. "void main() {",
  424. " vNormal = normalize( normalMatrix * normal );",
  425. THREE.ShaderChunk[ "begin_vertex" ],
  426. THREE.ShaderChunk[ "morphtarget_vertex" ],
  427. THREE.ShaderChunk[ "project_vertex" ],
  428. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  429. "}"
  430. ].join( "\n" ),
  431. fragmentShader: [
  432. "uniform float opacity;",
  433. "varying vec3 vNormal;",
  434. THREE.ShaderChunk[ "common" ],
  435. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  436. "void main() {",
  437. " gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
  438. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  439. "}"
  440. ].join( "\n" )
  441. },
  442. /* -------------------------------------------------------------------------
  443. // Cube map shader
  444. ------------------------------------------------------------------------- */
  445. 'cube': {
  446. uniforms: { "tCube": { type: "t", value: null },
  447. "tFlip": { type: "f", value: - 1 } },
  448. vertexShader: [
  449. "varying vec3 vWorldPosition;",
  450. THREE.ShaderChunk[ "common" ],
  451. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  452. "void main() {",
  453. " vWorldPosition = transformDirection( position, modelMatrix );",
  454. " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  455. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  456. "}"
  457. ].join( "\n" ),
  458. fragmentShader: [
  459. "uniform samplerCube tCube;",
  460. "uniform float tFlip;",
  461. "varying vec3 vWorldPosition;",
  462. THREE.ShaderChunk[ "common" ],
  463. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  464. "void main() {",
  465. " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
  466. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  467. "}"
  468. ].join( "\n" )
  469. },
  470. /* -------------------------------------------------------------------------
  471. // Cube map shader
  472. ------------------------------------------------------------------------- */
  473. 'equirect': {
  474. uniforms: { "tEquirect": { type: "t", value: null },
  475. "tFlip": { type: "f", value: - 1 } },
  476. vertexShader: [
  477. "varying vec3 vWorldPosition;",
  478. THREE.ShaderChunk[ "common" ],
  479. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  480. "void main() {",
  481. " vWorldPosition = transformDirection( position, modelMatrix );",
  482. " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  483. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  484. "}"
  485. ].join( "\n" ),
  486. fragmentShader: [
  487. "uniform sampler2D tEquirect;",
  488. "uniform float tFlip;",
  489. "varying vec3 vWorldPosition;",
  490. THREE.ShaderChunk[ "common" ],
  491. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  492. "void main() {",
  493. // " gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
  494. "vec3 direction = normalize( vWorldPosition );",
  495. "vec2 sampleUV;",
  496. "sampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );",
  497. "sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;",
  498. "gl_FragColor = texture2D( tEquirect, sampleUV );",
  499. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  500. "}"
  501. ].join( "\n" )
  502. },
  503. /* Depth encoding into RGBA texture
  504. *
  505. * based on SpiderGL shadow map example
  506. * http://spidergl.org/example.php?id=6
  507. *
  508. * originally from
  509. * http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD
  510. *
  511. * see also
  512. * http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
  513. */
  514. 'depthRGBA': {
  515. uniforms: {},
  516. vertexShader: [
  517. THREE.ShaderChunk[ "common" ],
  518. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  519. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  520. THREE.ShaderChunk[ "logdepthbuf_pars_vertex" ],
  521. "void main() {",
  522. THREE.ShaderChunk[ "skinbase_vertex" ],
  523. THREE.ShaderChunk[ "begin_vertex" ],
  524. THREE.ShaderChunk[ "morphtarget_vertex" ],
  525. THREE.ShaderChunk[ "skinning_vertex" ],
  526. THREE.ShaderChunk[ "project_vertex" ],
  527. THREE.ShaderChunk[ "logdepthbuf_vertex" ],
  528. "}"
  529. ].join( "\n" ),
  530. fragmentShader: [
  531. THREE.ShaderChunk[ "common" ],
  532. THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
  533. "vec4 pack_depth( const in float depth ) {",
  534. " const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
  535. " const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
  536. " vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );", // " vec4 res = fract( depth * bit_shift );",
  537. " res -= res.xxyz * bit_mask;",
  538. " return res;",
  539. "}",
  540. "void main() {",
  541. THREE.ShaderChunk[ "logdepthbuf_fragment" ],
  542. " #ifdef USE_LOGDEPTHBUF_EXT",
  543. " gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );",
  544. " #else",
  545. " gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );",
  546. " #endif",
  547. //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );",
  548. //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );",
  549. //"gl_FragData[ 0 ] = pack_depth( z );",
  550. //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );",
  551. "}"
  552. ].join( "\n" )
  553. },
  554. 'distanceRGBA': {
  555. uniforms: {
  556. "lightPos": { type: "v3", value: new THREE.Vector3(0,0,0) }
  557. },
  558. vertexShader: [
  559. "varying vec4 vWorldPosition;",
  560. THREE.ShaderChunk[ "common" ],
  561. THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
  562. THREE.ShaderChunk[ "skinning_pars_vertex" ],
  563. "void main() {",
  564. "#ifdef USE_SKINNING",
  565. " vWorldPosition = modelMatrix * skinned;",
  566. "#else",
  567. " vWorldPosition = modelMatrix * vec4( position, 1.0 );",
  568. "#endif",
  569. THREE.ShaderChunk[ "skinbase_vertex" ],
  570. THREE.ShaderChunk[ "begin_vertex" ],
  571. THREE.ShaderChunk[ "morphtarget_vertex" ],
  572. THREE.ShaderChunk[ "skinning_vertex" ],
  573. THREE.ShaderChunk[ "project_vertex" ],
  574. "}"
  575. ].join("\n"),
  576. fragmentShader: [
  577. "uniform vec3 lightPos;",
  578. "varying vec4 vWorldPosition;",
  579. THREE.ShaderChunk[ "common" ],
  580. "vec4 pack1K (float depth) {",
  581. " depth /= 1000.0;",
  582. " const vec4 bitSh = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);",
  583. " const vec4 bitMsk = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);",
  584. " vec4 res = fract(depth * bitSh);",
  585. " res -= res.xxyz * bitMsk;",
  586. " return res; ",
  587. "}",
  588. "float unpack1K (vec4 color) {",
  589. " const vec4 bitSh = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);",
  590. " return dot(color, bitSh) * 1000.0;",
  591. "}",
  592. "void main() {",
  593. " gl_FragColor = pack1K( length(vWorldPosition.xyz - lightPos.xyz) );",
  594. "}"
  595. ].join("\n")
  596. }
  597. };