ToonShader.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. import {
  2. Color,
  3. Vector3
  4. } from 'three';
  5. /**
  6. * Collection of toon shaders.
  7. *
  8. * @module TriangleBlurShader
  9. * */
  10. /**
  11. * Toon1 shader.
  12. *
  13. * @constant
  14. * @type {Object}
  15. */
  16. const ToonShader1 = {
  17. uniforms: {
  18. 'uDirLightPos': { value: new Vector3() },
  19. 'uDirLightColor': { value: new Color( 0xeeeeee ) },
  20. 'uAmbientLightColor': { value: new Color( 0x050505 ) },
  21. 'uBaseColor': { value: new Color( 0xffffff ) }
  22. },
  23. vertexShader: /* glsl */`
  24. varying vec3 vNormal;
  25. varying vec3 vRefract;
  26. void main() {
  27. vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
  28. vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
  29. vec3 worldNormal = normalize ( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );
  30. vNormal = normalize( normalMatrix * normal );
  31. vec3 I = worldPosition.xyz - cameraPosition;
  32. vRefract = refract( normalize( I ), worldNormal, 1.02 );
  33. gl_Position = projectionMatrix * mvPosition;
  34. }`,
  35. fragmentShader: /* glsl */`
  36. 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. #include <colorspace_fragment>
  56. }`
  57. };
  58. /**
  59. * Toon2 shader.
  60. *
  61. * @constant
  62. * @type {Object}
  63. */
  64. const ToonShader2 = {
  65. uniforms: {
  66. 'uDirLightPos': { value: new Vector3() },
  67. 'uDirLightColor': { value: new Color( 0xeeeeee ) },
  68. 'uAmbientLightColor': { value: new Color( 0x050505 ) },
  69. 'uBaseColor': { value: new Color( 0xeeeeee ) },
  70. 'uLineColor1': { value: new Color( 0x808080 ) },
  71. 'uLineColor2': { value: new Color( 0x000000 ) },
  72. 'uLineColor3': { value: new Color( 0x000000 ) },
  73. 'uLineColor4': { value: new Color( 0x000000 ) }
  74. },
  75. vertexShader: /* glsl */`
  76. varying vec3 vNormal;
  77. void main() {
  78. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  79. vNormal = normalize( normalMatrix * normal );
  80. }`,
  81. fragmentShader: /* glsl */`
  82. uniform vec3 uBaseColor;
  83. uniform vec3 uLineColor1;
  84. uniform vec3 uLineColor2;
  85. uniform vec3 uLineColor3;
  86. uniform vec3 uLineColor4;
  87. uniform vec3 uDirLightPos;
  88. uniform vec3 uDirLightColor;
  89. uniform vec3 uAmbientLightColor;
  90. varying vec3 vNormal;
  91. void main() {
  92. float camera = max( dot( normalize( vNormal ), vec3( 0.0, 0.0, 1.0 ) ), 0.4);
  93. float light = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);
  94. gl_FragColor = vec4( uBaseColor, 1.0 );
  95. if ( length(uAmbientLightColor + uDirLightColor * light) < 1.00 ) {
  96. gl_FragColor *= vec4( uLineColor1, 1.0 );
  97. }
  98. if ( length(uAmbientLightColor + uDirLightColor * camera) < 0.50 ) {
  99. gl_FragColor *= vec4( uLineColor2, 1.0 );
  100. }
  101. #include <colorspace_fragment>
  102. }`
  103. };
  104. /**
  105. * Toon Hatching shader.
  106. *
  107. * @constant
  108. * @type {Object}
  109. */
  110. const ToonShaderHatching = {
  111. uniforms: {
  112. 'uDirLightPos': { value: new Vector3() },
  113. 'uDirLightColor': { value: new Color( 0xeeeeee ) },
  114. 'uAmbientLightColor': { value: new Color( 0x050505 ) },
  115. 'uBaseColor': { value: new Color( 0xffffff ) },
  116. 'uLineColor1': { value: new Color( 0x000000 ) },
  117. 'uLineColor2': { value: new Color( 0x000000 ) },
  118. 'uLineColor3': { value: new Color( 0x000000 ) },
  119. 'uLineColor4': { value: new Color( 0x000000 ) }
  120. },
  121. vertexShader: /* glsl */`
  122. varying vec3 vNormal;
  123. void main() {
  124. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  125. vNormal = normalize( normalMatrix * normal );
  126. }`,
  127. fragmentShader: /* glsl */`
  128. uniform vec3 uBaseColor;
  129. uniform vec3 uLineColor1;
  130. uniform vec3 uLineColor2;
  131. uniform vec3 uLineColor3;
  132. uniform vec3 uLineColor4;
  133. uniform vec3 uDirLightPos;
  134. uniform vec3 uDirLightColor;
  135. uniform vec3 uAmbientLightColor;
  136. varying vec3 vNormal;
  137. void main() {
  138. float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);
  139. vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;
  140. gl_FragColor = vec4( uBaseColor, 1.0 );
  141. if ( length(lightWeighting) < 1.00 ) {
  142. if ( mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {
  143. gl_FragColor = vec4( uLineColor1, 1.0 );
  144. }
  145. }
  146. if ( length(lightWeighting) < 0.75 ) {
  147. if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {
  148. gl_FragColor = vec4( uLineColor2, 1.0 );
  149. }
  150. }
  151. if ( length(lightWeighting) < 0.50 ) {
  152. if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {
  153. gl_FragColor = vec4( uLineColor3, 1.0 );
  154. }
  155. }
  156. if ( length(lightWeighting) < 0.3465 ) {
  157. if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {
  158. gl_FragColor = vec4( uLineColor4, 1.0 );
  159. }
  160. }
  161. #include <colorspace_fragment>
  162. }`
  163. };
  164. /**
  165. * Toon Dotted shader.
  166. *
  167. * @constant
  168. * @type {Object}
  169. */
  170. const ToonShaderDotted = {
  171. uniforms: {
  172. 'uDirLightPos': { value: new Vector3() },
  173. 'uDirLightColor': { value: new Color( 0xeeeeee ) },
  174. 'uAmbientLightColor': { value: new Color( 0x050505 ) },
  175. 'uBaseColor': { value: new Color( 0xffffff ) },
  176. 'uLineColor1': { value: new Color( 0x000000 ) }
  177. },
  178. vertexShader: /* glsl */`
  179. varying vec3 vNormal;
  180. void main() {
  181. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  182. vNormal = normalize( normalMatrix * normal );
  183. }`,
  184. fragmentShader: /* glsl */`
  185. uniform vec3 uBaseColor;
  186. uniform vec3 uLineColor1;
  187. uniform vec3 uLineColor2;
  188. uniform vec3 uLineColor3;
  189. uniform vec3 uLineColor4;
  190. uniform vec3 uDirLightPos;
  191. uniform vec3 uDirLightColor;
  192. uniform vec3 uAmbientLightColor;
  193. varying vec3 vNormal;
  194. void main() {
  195. float directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);
  196. vec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;
  197. gl_FragColor = vec4( uBaseColor, 1.0 );
  198. if ( length(lightWeighting) < 1.00 ) {
  199. if ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {
  200. gl_FragColor = vec4( uLineColor1, 1.0 );
  201. }
  202. }
  203. if ( length(lightWeighting) < 0.50 ) {
  204. if ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {
  205. gl_FragColor = vec4( uLineColor1, 1.0 );
  206. }
  207. }
  208. #include <colorspace_fragment>
  209. }`
  210. };
  211. export { ToonShader1, ToonShader2, ToonShaderHatching, ToonShaderDotted };
粤ICP备19079148号