common.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // Luma
  3. //
  4. THREE.NodeLib.add( new THREE.ConstNode( "vec3 LUMA vec3(0.2125, 0.7154, 0.0721)" ) );
  5. //
  6. // NormalMap
  7. //
  8. THREE.NodeLib.add( new THREE.FunctionNode( [
  9. // Per-Pixel Tangent Space Normal Mapping
  10. // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
  11. "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 map, vec2 mUv, vec2 normalScale ) {",
  12. // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
  13. " vec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );",
  14. " vec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );",
  15. " vec2 st0 = dFdx( mUv.st );",
  16. " vec2 st1 = dFdy( mUv.st );",
  17. " float scale = sign( st1.t * st0.s - st0.t * st1.s );", // we do not care about the magnitude
  18. " vec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );",
  19. " vec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );",
  20. " vec3 N = normalize( surf_norm );",
  21. " mat3 tsn = mat3( S, T, N );",
  22. " vec3 mapN = map * 2.0 - 1.0;",
  23. " mapN.xy *= normalScale;",
  24. " mapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );",
  25. " return normalize( tsn * mapN );",
  26. "}"
  27. ].join( "\n" ), null, { derivatives: true } ) );
  28. //
  29. // BumpMap
  30. //
  31. THREE.NodeLib.add( new THREE.FunctionNode( [
  32. // Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen
  33. // http://api.unrealengine.com/attachments/Engine/Rendering/LightingAndShadows/BumpMappingWithoutTangentSpace/mm_sfgrad_bump.pdf
  34. // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
  35. "vec2 dHdxy_fwd( sampler2D bumpMap, vec2 vUv, float bumpScale ) {",
  36. // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
  37. " vec2 dSTdx = dFdx( vUv );",
  38. " vec2 dSTdy = dFdy( vUv );",
  39. " float Hll = bumpScale * texture2D( bumpMap, vUv ).x;",
  40. " float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;",
  41. " float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;",
  42. " return vec2( dBx, dBy );",
  43. "}"
  44. ].join( "\n" ), null, { derivatives: true } ) );
  45. THREE.NodeLib.add( new THREE.FunctionNode( [
  46. "vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {",
  47. // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
  48. " vec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );",
  49. " vec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );",
  50. " vec3 vN = surf_norm;", // normalized
  51. " vec3 R1 = cross( vSigmaY, vN );",
  52. " vec3 R2 = cross( vN, vSigmaX );",
  53. " float fDet = dot( vSigmaX, R1 );",
  54. " fDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );",
  55. " vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );",
  56. " return normalize( abs( fDet ) * surf_norm - vGrad );",
  57. "}"
  58. ].join( "\n" ), null, { derivatives: true } ) );
  59. //
  60. // Noise
  61. //
  62. THREE.NodeLib.add( new THREE.FunctionNode( [
  63. "float snoise(vec2 co) {",
  64. " return fract( sin( dot(co.xy, vec2(12.9898,78.233) ) ) * 43758.5453 );",
  65. "}"
  66. ].join( "\n" ) ) );
  67. //
  68. // Hue
  69. //
  70. THREE.NodeLib.add( new THREE.FunctionNode( [
  71. "vec3 hue_rgb(vec3 rgb, float adjustment) {",
  72. " const mat3 RGBtoYIQ = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);",
  73. " const mat3 YIQtoRGB = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.107, 1.7046);",
  74. " vec3 yiq = RGBtoYIQ * rgb;",
  75. " float hue = atan(yiq.z, yiq.y) + adjustment;",
  76. " float chroma = sqrt(yiq.z * yiq.z + yiq.y * yiq.y);",
  77. " return YIQtoRGB * vec3(yiq.x, chroma * cos(hue), chroma * sin(hue));",
  78. "}"
  79. ].join( "\n" ) ) );
  80. //
  81. // Saturation
  82. //
  83. THREE.NodeLib.add( new THREE.FunctionNode( [
  84. // Algorithm from Chapter 16 of OpenGL Shading Language
  85. "vec3 saturation_rgb(vec3 rgb, float adjustment) {",
  86. " vec3 intensity = vec3(dot(rgb, LUMA));",
  87. " return mix(intensity, rgb, adjustment);",
  88. "}"
  89. ].join( "\n" ) ) );
  90. //
  91. // Luminance
  92. //
  93. THREE.NodeLib.add( new THREE.FunctionNode( [
  94. // Algorithm from Chapter 10 of Graphics Shaders
  95. "float luminance_rgb(vec3 rgb) {",
  96. " return dot(rgb, LUMA);",
  97. "}"
  98. ].join( "\n" ) ) );
  99. //
  100. // Vibrance
  101. //
  102. THREE.NodeLib.add( new THREE.FunctionNode( [
  103. // Shader by Evan Wallace adapted by @lo-th
  104. "vec3 vibrance_rgb(vec3 rgb, float adjustment) {",
  105. " float average = (rgb.r + rgb.g + rgb.b) / 3.0;",
  106. " float mx = max(rgb.r, max(rgb.g, rgb.b));",
  107. " float amt = (mx - average) * (-3.0 * adjustment);",
  108. " return mix(rgb.rgb, vec3(mx), amt);",
  109. "}"
  110. ].join( "\n" ) ) );