PackedPhongMaterial.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /**
  2. * `PackedPhongMaterial` inherited from THREE.MeshPhongMaterial
  3. *
  4. * @param {Object} parameters
  5. */
  6. import {
  7. MeshPhongMaterial,
  8. ShaderChunk,
  9. ShaderLib,
  10. UniformsUtils,
  11. } from 'three';
  12. class PackedPhongMaterial extends MeshPhongMaterial {
  13. constructor( parameters ) {
  14. super();
  15. this.defines = {};
  16. this.type = 'PackedPhongMaterial';
  17. this.uniforms = UniformsUtils.merge( [
  18. ShaderLib.phong.uniforms,
  19. {
  20. quantizeMatPos: { value: null },
  21. quantizeMatUV: { value: null }
  22. }
  23. ] );
  24. this.vertexShader = [
  25. '#define PHONG',
  26. 'varying vec3 vViewPosition;',
  27. ShaderChunk.common,
  28. ShaderChunk.uv_pars_vertex,
  29. ShaderChunk.displacementmap_pars_vertex,
  30. ShaderChunk.envmap_pars_vertex,
  31. ShaderChunk.color_pars_vertex,
  32. ShaderChunk.fog_pars_vertex,
  33. ShaderChunk.normal_pars_vertex,
  34. ShaderChunk.morphtarget_pars_vertex,
  35. ShaderChunk.skinning_pars_vertex,
  36. ShaderChunk.shadowmap_pars_vertex,
  37. ShaderChunk.logdepthbuf_pars_vertex,
  38. ShaderChunk.clipping_planes_pars_vertex,
  39. `#ifdef USE_PACKED_NORMAL
  40. #if USE_PACKED_NORMAL == 0
  41. vec3 decodeNormal(vec3 packedNormal)
  42. {
  43. float x = packedNormal.x * 2.0 - 1.0;
  44. float y = packedNormal.y * 2.0 - 1.0;
  45. vec2 scth = vec2(sin(x * PI), cos(x * PI));
  46. vec2 scphi = vec2(sqrt(1.0 - y * y), y);
  47. return normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) );
  48. }
  49. #endif
  50. #if USE_PACKED_NORMAL == 1
  51. vec3 decodeNormal(vec3 packedNormal)
  52. {
  53. vec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y));
  54. if (v.z < 0.0)
  55. {
  56. v.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);
  57. }
  58. return normalize(v);
  59. }
  60. #endif
  61. #if USE_PACKED_NORMAL == 2
  62. vec3 decodeNormal(vec3 packedNormal)
  63. {
  64. vec3 v = (packedNormal * 2.0) - 1.0;
  65. return normalize(v);
  66. }
  67. #endif
  68. #endif`,
  69. `#ifdef USE_PACKED_POSITION
  70. #if USE_PACKED_POSITION == 0
  71. uniform mat4 quantizeMatPos;
  72. #endif
  73. #endif`,
  74. `#ifdef USE_PACKED_UV
  75. #if USE_PACKED_UV == 1
  76. uniform mat3 quantizeMatUV;
  77. #endif
  78. #endif`,
  79. `#ifdef USE_PACKED_UV
  80. #if USE_PACKED_UV == 0
  81. vec2 decodeUV(vec2 packedUV)
  82. {
  83. vec2 uv = (packedUV * 2.0) - 1.0;
  84. return uv;
  85. }
  86. #endif
  87. #if USE_PACKED_UV == 1
  88. vec2 decodeUV(vec2 packedUV)
  89. {
  90. vec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy;
  91. return uv;
  92. }
  93. #endif
  94. #endif`,
  95. 'void main() {',
  96. ShaderChunk.uv_vertex,
  97. `#ifdef USE_MAP
  98. #ifdef USE_PACKED_UV
  99. vMapUv = decodeUV(vMapUv);
  100. #endif
  101. #endif`,
  102. ShaderChunk.color_vertex,
  103. ShaderChunk.morphcolor_vertex,
  104. ShaderChunk.beginnormal_vertex,
  105. `#ifdef USE_PACKED_NORMAL
  106. objectNormal = decodeNormal(objectNormal);
  107. #endif
  108. #ifdef USE_TANGENT
  109. vec3 objectTangent = vec3( tangent.xyz );
  110. #endif
  111. `,
  112. ShaderChunk.morphnormal_vertex,
  113. ShaderChunk.skinbase_vertex,
  114. ShaderChunk.skinnormal_vertex,
  115. ShaderChunk.defaultnormal_vertex,
  116. ShaderChunk.normal_vertex,
  117. ShaderChunk.begin_vertex,
  118. `#ifdef USE_PACKED_POSITION
  119. #if USE_PACKED_POSITION == 0
  120. transformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz;
  121. #endif
  122. #endif`,
  123. ShaderChunk.morphtarget_vertex,
  124. ShaderChunk.skinning_vertex,
  125. ShaderChunk.displacementmap_vertex,
  126. ShaderChunk.project_vertex,
  127. ShaderChunk.logdepthbuf_vertex,
  128. ShaderChunk.clipping_planes_vertex,
  129. 'vViewPosition = - mvPosition.xyz;',
  130. ShaderChunk.worldpos_vertex,
  131. ShaderChunk.envmap_vertex,
  132. ShaderChunk.shadowmap_vertex,
  133. ShaderChunk.fog_vertex,
  134. '}',
  135. ].join( '\n' );
  136. // Use the original MeshPhongMaterial's fragmentShader.
  137. this.fragmentShader = ShaderLib.phong.fragmentShader;
  138. this.setValues( parameters );
  139. }
  140. }
  141. export { PackedPhongMaterial };