PackedPhongMaterial.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. '#ifndef FLAT_SHADED',
  28. 'varying vec3 vNormal;',
  29. '#endif',
  30. ShaderChunk.common,
  31. ShaderChunk.uv_pars_vertex,
  32. ShaderChunk.uv2_pars_vertex,
  33. ShaderChunk.displacementmap_pars_vertex,
  34. ShaderChunk.envmap_pars_vertex,
  35. ShaderChunk.color_pars_vertex,
  36. ShaderChunk.fog_pars_vertex,
  37. ShaderChunk.morphtarget_pars_vertex,
  38. ShaderChunk.skinning_pars_vertex,
  39. ShaderChunk.shadowmap_pars_vertex,
  40. ShaderChunk.logdepthbuf_pars_vertex,
  41. ShaderChunk.clipping_planes_pars_vertex,
  42. `#ifdef USE_PACKED_NORMAL
  43. #if USE_PACKED_NORMAL == 0
  44. vec3 decodeNormal(vec3 packedNormal)
  45. {
  46. float x = packedNormal.x * 2.0 - 1.0;
  47. float y = packedNormal.y * 2.0 - 1.0;
  48. vec2 scth = vec2(sin(x * PI), cos(x * PI));
  49. vec2 scphi = vec2(sqrt(1.0 - y * y), y);
  50. return normalize( vec3(scth.y * scphi.x, scth.x * scphi.x, scphi.y) );
  51. }
  52. #endif
  53. #if USE_PACKED_NORMAL == 1
  54. vec3 decodeNormal(vec3 packedNormal)
  55. {
  56. vec3 v = vec3(packedNormal.xy, 1.0 - abs(packedNormal.x) - abs(packedNormal.y));
  57. if (v.z < 0.0)
  58. {
  59. v.xy = (1.0 - abs(v.yx)) * vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);
  60. }
  61. return normalize(v);
  62. }
  63. #endif
  64. #if USE_PACKED_NORMAL == 2
  65. vec3 decodeNormal(vec3 packedNormal)
  66. {
  67. vec3 v = (packedNormal * 2.0) - 1.0;
  68. return normalize(v);
  69. }
  70. #endif
  71. #endif`,
  72. `#ifdef USE_PACKED_POSITION
  73. #if USE_PACKED_POSITION == 0
  74. uniform mat4 quantizeMatPos;
  75. #endif
  76. #endif`,
  77. `#ifdef USE_PACKED_UV
  78. #if USE_PACKED_UV == 1
  79. uniform mat3 quantizeMatUV;
  80. #endif
  81. #endif`,
  82. `#ifdef USE_PACKED_UV
  83. #if USE_PACKED_UV == 0
  84. vec2 decodeUV(vec2 packedUV)
  85. {
  86. vec2 uv = (packedUV * 2.0) - 1.0;
  87. return uv;
  88. }
  89. #endif
  90. #if USE_PACKED_UV == 1
  91. vec2 decodeUV(vec2 packedUV)
  92. {
  93. vec2 uv = ( vec3(packedUV, 1.0) * quantizeMatUV ).xy;
  94. return uv;
  95. }
  96. #endif
  97. #endif`,
  98. 'void main() {',
  99. ShaderChunk.uv_vertex,
  100. `#ifdef USE_UV
  101. #ifdef USE_PACKED_UV
  102. vUv = decodeUV(vUv);
  103. #endif
  104. #endif`,
  105. ShaderChunk.uv2_vertex,
  106. ShaderChunk.color_vertex,
  107. ShaderChunk.beginnormal_vertex,
  108. `#ifdef USE_PACKED_NORMAL
  109. objectNormal = decodeNormal(objectNormal);
  110. #endif
  111. #ifdef USE_TANGENT
  112. vec3 objectTangent = vec3( tangent.xyz );
  113. #endif
  114. `,
  115. ShaderChunk.morphnormal_vertex,
  116. ShaderChunk.skinbase_vertex,
  117. ShaderChunk.skinnormal_vertex,
  118. ShaderChunk.defaultnormal_vertex,
  119. '#ifndef FLAT_SHADED',
  120. ' vNormal = normalize( transformedNormal );',
  121. '#endif',
  122. ShaderChunk.begin_vertex,
  123. `#ifdef USE_PACKED_POSITION
  124. #if USE_PACKED_POSITION == 0
  125. transformed = ( vec4(transformed, 1.0) * quantizeMatPos ).xyz;
  126. #endif
  127. #endif`,
  128. ShaderChunk.morphtarget_vertex,
  129. ShaderChunk.skinning_vertex,
  130. ShaderChunk.displacementmap_vertex,
  131. ShaderChunk.project_vertex,
  132. ShaderChunk.logdepthbuf_vertex,
  133. ShaderChunk.clipping_planes_vertex,
  134. 'vViewPosition = - mvPosition.xyz;',
  135. ShaderChunk.worldpos_vertex,
  136. ShaderChunk.envmap_vertex,
  137. ShaderChunk.shadowmap_vertex,
  138. ShaderChunk.fog_vertex,
  139. '}',
  140. ].join( '\n' );
  141. // Use the original MeshPhongMaterial's fragmentShader.
  142. this.fragmentShader = [
  143. '#define PHONG',
  144. 'uniform vec3 diffuse;',
  145. 'uniform vec3 emissive;',
  146. 'uniform vec3 specular;',
  147. 'uniform float shininess;',
  148. 'uniform float opacity;',
  149. ShaderChunk.common,
  150. ShaderChunk.packing,
  151. ShaderChunk.dithering_pars_fragment,
  152. ShaderChunk.color_pars_fragment,
  153. ShaderChunk.uv_pars_fragment,
  154. ShaderChunk.uv2_pars_fragment,
  155. ShaderChunk.map_pars_fragment,
  156. ShaderChunk.alphamap_pars_fragment,
  157. ShaderChunk.aomap_pars_fragment,
  158. ShaderChunk.lightmap_pars_fragment,
  159. ShaderChunk.emissivemap_pars_fragment,
  160. ShaderChunk.envmap_common_pars_fragment,
  161. ShaderChunk.envmap_pars_fragment,
  162. ShaderChunk.cube_uv_reflection_fragment,
  163. ShaderChunk.fog_pars_fragment,
  164. ShaderChunk.bsdfs,
  165. ShaderChunk.lights_pars_begin,
  166. ShaderChunk.lights_phong_pars_fragment,
  167. ShaderChunk.shadowmap_pars_fragment,
  168. ShaderChunk.bumpmap_pars_fragment,
  169. ShaderChunk.normalmap_pars_fragment,
  170. ShaderChunk.specularmap_pars_fragment,
  171. ShaderChunk.logdepthbuf_pars_fragment,
  172. ShaderChunk.clipping_planes_pars_fragment,
  173. 'void main() {',
  174. ShaderChunk.clipping_planes_fragment,
  175. 'vec4 diffuseColor = vec4( diffuse, opacity );',
  176. 'ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );',
  177. 'vec3 totalEmissiveRadiance = emissive;',
  178. ShaderChunk.logdepthbuf_fragment,
  179. ShaderChunk.map_fragment,
  180. ShaderChunk.color_fragment,
  181. ShaderChunk.alphamap_fragment,
  182. ShaderChunk.alphatest_fragment,
  183. ShaderChunk.specularmap_fragment,
  184. ShaderChunk.normal_fragment_begin,
  185. ShaderChunk.normal_fragment_maps,
  186. ShaderChunk.emissivemap_fragment,
  187. // accumulation
  188. ShaderChunk.lights_phong_fragment,
  189. ShaderChunk.lights_fragment_begin,
  190. ShaderChunk.lights_fragment_maps,
  191. ShaderChunk.lights_fragment_end,
  192. // modulation
  193. ShaderChunk.aomap_fragment,
  194. 'vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;',
  195. ShaderChunk.envmap_fragment,
  196. 'gl_FragColor = vec4( outgoingLight, diffuseColor.a );',
  197. ShaderChunk.tonemapping_fragment,
  198. ShaderChunk.encodings_fragment,
  199. ShaderChunk.fog_fragment,
  200. ShaderChunk.premultiplied_alpha_fragment,
  201. ShaderChunk.dithering_fragment,
  202. '}',
  203. ].join( '\n' );
  204. this.setValues( parameters );
  205. }
  206. }
  207. export { PackedPhongMaterial };