ToonShader.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. ( function () {
  2. /**
  3. * Currently contains:
  4. *
  5. * toon1
  6. * toon2
  7. * hatching
  8. * dotted
  9. */
  10. const ToonShader1 = {
  11. uniforms: {
  12. 'uDirLightPos': {
  13. value: new THREE.Vector3()
  14. },
  15. 'uDirLightColor': {
  16. value: new THREE.Color( 0xeeeeee )
  17. },
  18. 'uAmbientLightColor': {
  19. value: new THREE.Color( 0x050505 )
  20. },
  21. 'uBaseColor': {
  22. value: new THREE.Color( 0xffffff )
  23. }
  24. },
  25. vertexShader: `varying vec3 vNormal;
  26. varying vec3 vRefract;
  27. void main() {
  28. vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
  29. vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
  30. vec3 worldNormal = normalize ( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );
  31. vNormal = normalize( normalMatrix * normal );
  32. vec3 I = worldPosition.xyz - cameraPosition;
  33. vRefract = refract( normalize( I ), worldNormal, 1.02 );
  34. gl_Position = projectionMatrix * mvPosition;
  35. }`,
  36. fragmentShader: `uniform vec3 uBaseColor;
  37. uniform vec3 uDirLightPos;
  38. uniform vec3 uDirLightColor;
  39. uniform vec3 uAmbientLightColor;
  40. varying vec3 vNormal;
  41. varying vec3 vRefract;
  42. void main() {
  43. float directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);
  44. vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;
  45. float intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );
  46. intensity += length(lightWeighting) * 0.2;
  47. float cameraWeighting = dot( normalize( vNormal ), vRefract );
  48. intensity += pow( 1.0 - length( cameraWeighting ), 6.0 );
  49. intensity = intensity * 0.2 + 0.3;
  50. if ( intensity < 0.50 ) {
  51. gl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );
  52. } else {
  53. gl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );
  54. }
  55. }`
  56. };
  57. const ToonShader2 = {
  58. uniforms: {
  59. 'uDirLightPos': {
  60. value: new THREE.Vector3()
  61. },
  62. 'uDirLightColor': {
  63. value: new THREE.Color( 0xeeeeee )
  64. },
  65. 'uAmbientLightColor': {
  66. value: new THREE.Color( 0x050505 )
  67. },
  68. 'uBaseColor': {
  69. value: new THREE.Color( 0xeeeeee )
  70. },
  71. 'uLineColor1': {
  72. value: new THREE.Color( 0x808080 )
  73. },
  74. 'uLineColor2': {
  75. value: new THREE.Color( 0x000000 )
  76. },
  77. 'uLineColor3': {
  78. value: new THREE.Color( 0x000000 )
  79. },
  80. 'uLineColor4': {
  81. value: new THREE.Color( 0x000000 )
  82. }
  83. },
  84. vertexShader: `varying vec3 vNormal;
  85. void main() {
  86. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  87. vNormal = normalize( normalMatrix * normal );
  88. }`,
  89. fragmentShader: `uniform vec3 uBaseColor;
  90. uniform vec3 uLineColor1;
  91. uniform vec3 uLineColor2;
  92. uniform vec3 uLineColor3;
  93. uniform vec3 uLineColor4;
  94. uniform vec3 uDirLightPos;
  95. uniform vec3 uDirLightColor;
  96. uniform vec3 uAmbientLightColor;
  97. varying vec3 vNormal;
  98. void main() {
  99. float camera = max( dot( normalize( vNormal ), vec3( 0.0, 0.0, 1.0 ) ), 0.4);
  100. float light = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);
  101. gl_FragColor = vec4( uBaseColor, 1.0 );
  102. if ( length(uAmbientLightColor + uDirLightColor * light) < 1.00 ) {
  103. gl_FragColor *= vec4( uLineColor1, 1.0 );
  104. }
  105. if ( length(uAmbientLightColor + uDirLightColor * camera) < 0.50 ) {
  106. gl_FragColor *= vec4( uLineColor2, 1.0 );
  107. }
  108. }`
  109. };
  110. const ToonShaderHatching = {
  111. uniforms: {
  112. 'uDirLightPos': {
  113. value: new THREE.Vector3()
  114. },
  115. 'uDirLightColor': {
  116. value: new THREE.Color( 0xeeeeee )
  117. },
  118. 'uAmbientLightColor': {
  119. value: new THREE.Color( 0x050505 )
  120. },
  121. 'uBaseColor': {
  122. value: new THREE.Color( 0xffffff )
  123. },
  124. 'uLineColor1': {
  125. value: new THREE.Color( 0x000000 )
  126. },
  127. 'uLineColor2': {
  128. value: new THREE.Color( 0x000000 )
  129. },
  130. 'uLineColor3': {
  131. value: new THREE.Color( 0x000000 )
  132. },
  133. 'uLineColor4': {
  134. value: new THREE.Color( 0x000000 )
  135. }
  136. },
  137. vertexShader: `varying vec3 vNormal;
  138. void main() {
  139. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  140. vNormal = normalize( normalMatrix * normal );
  141. }`,
  142. fragmentShader: `uniform vec3 uBaseColor;
  143. uniform vec3 uLineColor1;
  144. uniform vec3 uLineColor2;
  145. uniform vec3 uLineColor3;
  146. uniform vec3 uLineColor4;
  147. uniform vec3 uDirLightPos;
  148. uniform vec3 uDirLightColor;
  149. uniform vec3 uAmbientLightColor;
  150. varying vec3 vNormal;
  151. void main() {
  152. float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);
  153. vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;
  154. gl_FragColor = vec4( uBaseColor, 1.0 );
  155. if ( length(lightWeighting) < 1.00 ) {
  156. if ( mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {
  157. gl_FragColor = vec4( uLineColor1, 1.0 );
  158. }
  159. }
  160. if ( length(lightWeighting) < 0.75 ) {
  161. if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {
  162. gl_FragColor = vec4( uLineColor2, 1.0 );
  163. }
  164. }
  165. if ( length(lightWeighting) < 0.50 ) {
  166. if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {
  167. gl_FragColor = vec4( uLineColor3, 1.0 );
  168. }
  169. }
  170. if ( length(lightWeighting) < 0.3465 ) {
  171. if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {
  172. gl_FragColor = vec4( uLineColor4, 1.0 );
  173. }
  174. }
  175. }`
  176. };
  177. const ToonShaderDotted = {
  178. uniforms: {
  179. 'uDirLightPos': {
  180. value: new THREE.Vector3()
  181. },
  182. 'uDirLightColor': {
  183. value: new THREE.Color( 0xeeeeee )
  184. },
  185. 'uAmbientLightColor': {
  186. value: new THREE.Color( 0x050505 )
  187. },
  188. 'uBaseColor': {
  189. value: new THREE.Color( 0xffffff )
  190. },
  191. 'uLineColor1': {
  192. value: new THREE.Color( 0x000000 )
  193. }
  194. },
  195. vertexShader: `varying vec3 vNormal;
  196. void main() {
  197. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  198. vNormal = normalize( normalMatrix * normal );
  199. }`,
  200. fragmentShader: `uniform vec3 uBaseColor;
  201. uniform vec3 uLineColor1;
  202. uniform vec3 uLineColor2;
  203. uniform vec3 uLineColor3;
  204. uniform vec3 uLineColor4;
  205. uniform vec3 uDirLightPos;
  206. uniform vec3 uDirLightColor;
  207. uniform vec3 uAmbientLightColor;
  208. varying vec3 vNormal;
  209. void main() {
  210. float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);
  211. vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;
  212. gl_FragColor = vec4( uBaseColor, 1.0 );
  213. if ( length(lightWeighting) < 1.00 ) {
  214. if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {
  215. gl_FragColor = vec4( uLineColor1, 1.0 );
  216. }
  217. }
  218. if ( length(lightWeighting) < 0.50 ) {
  219. if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {
  220. gl_FragColor = vec4( uLineColor1, 1.0 );
  221. }
  222. }
  223. }`
  224. };
  225. THREE.ToonShader1 = ToonShader1;
  226. THREE.ToonShader2 = ToonShader2;
  227. THREE.ToonShaderDotted = ToonShaderDotted;
  228. THREE.ToonShaderHatching = ToonShaderHatching;
  229. } )();