DeferredHelper.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * @author alteredq / http://alteredqualia.com/
  3. */
  4. THREE.DeferredHelper = function ( parameters ) {
  5. var width = parameters.width;
  6. var height = parameters.height;
  7. var black = new THREE.Color( 0x000000 );
  8. var colorShader = THREE.ShaderDeferred[ "color" ];
  9. var normalShader = THREE.ShaderDeferred[ "normals" ];
  10. var bumpShader = THREE.ShaderDeferred[ "bump" ];
  11. var clipDepthShader = THREE.ShaderDeferred[ "clipDepth" ];
  12. this.unlitShader = THREE.ShaderDeferred[ "unlit" ];
  13. this.lightShader = THREE.ShaderDeferred[ "light" ];
  14. this.compositeShader = THREE.ShaderDeferred[ "composite" ];
  15. this.unlitShader.uniforms[ "viewWidth" ].value = width;
  16. this.unlitShader.uniforms[ "viewHeight" ].value = height;
  17. this.lightShader.uniforms[ "viewWidth" ].value = width;
  18. this.lightShader.uniforms[ "viewHeight" ].value = height;
  19. var matNormal = new THREE.ShaderMaterial( {
  20. uniforms: THREE.UniformsUtils.clone( normalShader.uniforms ),
  21. vertexShader: normalShader.vertexShader,
  22. fragmentShader: normalShader.fragmentShader
  23. } );
  24. var matClipDepth = new THREE.ShaderMaterial( {
  25. uniforms: THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
  26. vertexShader: clipDepthShader.vertexShader,
  27. fragmentShader: clipDepthShader.fragmentShader
  28. } );
  29. this.addDeferredMaterials = function ( object ) {
  30. object.traverse( function( node ) {
  31. if ( !node.material ) return;
  32. var originalMaterial = node.material;
  33. // color material
  34. // diffuse color
  35. // specular color
  36. // shininess
  37. // diffuse map
  38. // vertex colors
  39. // alphaTest
  40. // morphs
  41. var uniforms = THREE.UniformsUtils.clone( colorShader.uniforms );
  42. var defines = { "USE_MAP": !! originalMaterial.map, "GAMMA_INPUT": true };
  43. var material = new THREE.ShaderMaterial( {
  44. fragmentShader: colorShader.fragmentShader,
  45. vertexShader: colorShader.vertexShader,
  46. uniforms: uniforms,
  47. defines: defines,
  48. shading: originalMaterial.shading
  49. } );
  50. var diffuse = originalMaterial.color;
  51. var specular = originalMaterial.specular !== undefined ? originalMaterial.specular : black;
  52. var shininess = originalMaterial.shininess !== undefined ? originalMaterial.shininess : 1;
  53. uniforms.diffuse.value.copy( diffuse );
  54. uniforms.specular.value.copy( specular );
  55. uniforms.shininess.value = shininess;
  56. uniforms.map.value = originalMaterial.map;
  57. material.vertexColors = originalMaterial.vertexColors;
  58. material.morphTargets = originalMaterial.morphTargets;
  59. material.morphNormals = originalMaterial.morphNormals;
  60. material.alphaTest = originalMaterial.alphaTest;
  61. if ( originalMaterial.bumpMap ) {
  62. var offset = originalMaterial.bumpMap.offset;
  63. var repeat = originalMaterial.bumpMap.repeat;
  64. uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
  65. }
  66. node.properties.colorMaterial = material;
  67. // normal material
  68. // vertex normals
  69. // morph normals
  70. // bump map
  71. // bump scale
  72. if ( originalMaterial.bumpMap ) {
  73. var uniforms = THREE.UniformsUtils.clone( bumpShader.uniforms );
  74. var normalMaterial = new THREE.ShaderMaterial( {
  75. uniforms: uniforms,
  76. vertexShader: bumpShader.vertexShader,
  77. fragmentShader: bumpShader.fragmentShader,
  78. defines: { "USE_BUMPMAP": true }
  79. } );
  80. uniforms.bumpMap.value = originalMaterial.bumpMap;
  81. uniforms.bumpScale.value = originalMaterial.bumpScale;
  82. var offset = originalMaterial.bumpMap.offset;
  83. var repeat = originalMaterial.bumpMap.repeat;
  84. uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
  85. node.properties.normalMaterial = normalMaterial;
  86. } else if ( originalMaterial.morphTargets ) {
  87. var normalMaterial = new THREE.ShaderMaterial( {
  88. uniforms: THREE.UniformsUtils.clone( normalShader.uniforms ),
  89. vertexShader: normalShader.vertexShader,
  90. fragmentShader: normalShader.fragmentShader,
  91. shading: originalMaterial.shading
  92. } );
  93. normalMaterial.morphTargets = originalMaterial.morphTargets;
  94. normalMaterial.morphNormals = originalMaterial.morphNormals;
  95. node.properties.normalMaterial = normalMaterial;
  96. } else {
  97. node.properties.normalMaterial = matNormal;
  98. }
  99. // depth material
  100. if ( originalMaterial.morphTargets ) {
  101. var depthMaterial = new THREE.ShaderMaterial( {
  102. uniforms: THREE.UniformsUtils.clone( clipDepthShader.uniforms ),
  103. vertexShader: clipDepthShader.vertexShader,
  104. fragmentShader: clipDepthShader.fragmentShader
  105. } );
  106. depthMaterial.morphTargets = originalMaterial.morphTargets;
  107. node.properties.depthMaterial = depthMaterial;
  108. } else {
  109. node.properties.depthMaterial = matClipDepth;
  110. }
  111. } );
  112. }
  113. };