NodeLib.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * @author sunag / http://www.sunag.com.br/
  3. */
  4. THREE.NodeLib = {
  5. nodes: {},
  6. add: function( node ) {
  7. this.nodes[ node.name ] = node;
  8. },
  9. remove: function( node ) {
  10. delete this.nodes[ node.name ];
  11. },
  12. get: function( name ) {
  13. return this.nodes[ name ];
  14. },
  15. contains: function( name ) {
  16. return this.nodes[ name ] != undefined;
  17. }
  18. };
  19. //
  20. // Luma
  21. //
  22. THREE.NodeLib.add( new THREE.ConstNode( "vec3 LUMA = vec3(0.2125, 0.7154, 0.0721);" ) );
  23. //
  24. // DepthColor
  25. //
  26. THREE.NodeLib.add( new THREE.FunctionNode( [
  27. "float depthcolor( float mNear, float mFar ) {",
  28. "#ifdef USE_LOGDEPTHBUF_EXT",
  29. "float depth = gl_FragDepthEXT / gl_FragCoord.w;",
  30. "#else",
  31. "float depth = gl_FragCoord.z / gl_FragCoord.w;",
  32. "#endif",
  33. "return 1.0 - smoothstep( mNear, mFar, depth );",
  34. "}"
  35. ].join( "\n" ) ) );
  36. //
  37. // NormalMap
  38. //
  39. THREE.NodeLib.add( new THREE.FunctionNode( [
  40. // Per-Pixel Tangent Space Normal Mapping
  41. // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
  42. "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 map, vec2 mUv, vec2 scale ) {",
  43. "vec3 q0 = dFdx( eye_pos );",
  44. "vec3 q1 = dFdy( eye_pos );",
  45. "vec2 st0 = dFdx( mUv.st );",
  46. "vec2 st1 = dFdy( mUv.st );",
  47. "vec3 S = normalize( q0 * st1.t - q1 * st0.t );",
  48. "vec3 T = normalize( -q0 * st1.s + q1 * st0.s );",
  49. "vec3 N = normalize( surf_norm );",
  50. "vec3 mapN = map * 2.0 - 1.0;",
  51. "mapN.xy = scale * mapN.xy;",
  52. "mat3 tsn = mat3( S, T, N );",
  53. "return normalize( tsn * mapN );",
  54. "}"
  55. ].join( "\n" ), null, { derivatives: true } ) );
  56. //
  57. // Noise
  58. //
  59. THREE.NodeLib.add( new THREE.FunctionNode( [
  60. "float snoise(vec2 co) {",
  61. "return fract( sin( dot(co.xy, vec2(12.9898,78.233) ) ) * 43758.5453 );",
  62. "}"
  63. ].join( "\n" ) ) );
  64. //
  65. // Hue
  66. //
  67. THREE.NodeLib.add( new THREE.FunctionNode( [
  68. "vec3 hue_rgb(vec3 rgb, float adjustment) {",
  69. "const mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);",
  70. "const mat3 YIQtoRGB = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.107, 1.7046);",
  71. "vec3 yiq = RGBtoYIQ * rgb;",
  72. "float hue = atan(yiq.z, yiq.y) + adjustment;",
  73. "float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y);",
  74. "return YIQtoRGB * vec3(yiq.x, chroma * cos(hue), chroma * sin(hue));",
  75. "}"
  76. ].join( "\n" ) ) );
  77. //
  78. // Saturation
  79. //
  80. THREE.NodeLib.add( new THREE.FunctionNode( [
  81. // Algorithm from Chapter 16 of OpenGL Shading Language
  82. "vec3 saturation_rgb(vec3 rgb, float adjustment) {",
  83. "vec3 intensity = vec3(dot(rgb, LUMA));",
  84. "return mix(intensity, rgb, adjustment);",
  85. "}"
  86. ].join( "\n" ) ) );
  87. //
  88. // Luminance
  89. //
  90. THREE.NodeLib.add( new THREE.FunctionNode( [
  91. // Algorithm from Chapter 10 of Graphics Shaders
  92. "float luminance_rgb(vec3 rgb) {",
  93. "return dot(rgb, LUMA);",
  94. "}"
  95. ].join( "\n" ) ) );
  96. //
  97. // Vibrance
  98. //
  99. THREE.NodeLib.add( new THREE.FunctionNode( [
  100. // Shader by Evan Wallace adapted from @lo-th
  101. "vec3 vibrance_rgb(vec3 rgb, float adjustment) {",
  102. "float average = (rgb.r + rgb.g + rgb.b) / 3.0;",
  103. "float mx = max(rgb.r, max(rgb.g, rgb.b));",
  104. "float amt = (mx - average) * (-3.0 * adjustment);",
  105. "return mix(rgb.rgb, vec3(mx), amt);",
  106. "}"
  107. ].join( "\n" ) ) );