DepthPassPlugin.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. * @author alteredq / http://alteredqualia.com/
  3. */
  4. THREE.DepthPassPlugin = function ( ) {
  5. this.enabled = false;
  6. this.renderTarget = null;
  7. var _gl,
  8. _renderer,
  9. _depthMaterial, _depthMaterialMorph,
  10. _frustum = new THREE.Frustum(),
  11. _projScreenMatrix = new THREE.Matrix4();
  12. this.init = function ( renderer ) {
  13. _gl = renderer.context;
  14. _renderer = renderer;
  15. var depthShader = THREE.ShaderLib[ "depthRGBA" ];
  16. var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
  17. _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
  18. _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );
  19. _depthMaterial._shadowPass = true;
  20. _depthMaterialMorph._shadowPass = true;
  21. };
  22. this.render = function ( scene, camera ) {
  23. if ( ! this.enabled ) return;
  24. this.update( scene, camera );
  25. };
  26. this.update = function ( scene, camera ) {
  27. var i, il, j, jl, n,
  28. program, buffer, material,
  29. webglObject, object, light,
  30. renderList,
  31. fog = null;
  32. // set GL state for depth map
  33. _gl.clearColor( 1, 1, 1, 1 );
  34. _gl.disable( _gl.BLEND );
  35. _renderer.setDepthTest( true );
  36. // update scene
  37. if ( _renderer.autoUpdateScene ) scene.updateMatrixWorld();
  38. // update camera matrices and frustum
  39. if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
  40. if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
  41. camera.matrixWorldInverse.getInverse( camera.matrixWorld );
  42. camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
  43. camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
  44. _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
  45. _frustum.setFromMatrix( _projScreenMatrix );
  46. // render depth map
  47. _renderer.setRenderTarget( this.renderTarget );
  48. _renderer.clear();
  49. // set object matrices & frustum culling
  50. renderList = scene.__webglObjects;
  51. for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
  52. webglObject = renderList[ j ];
  53. object = webglObject.object;
  54. webglObject.render = false;
  55. if ( object.visible ) {
  56. if ( ! ( object instanceof THREE.Mesh ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) {
  57. object.matrixWorld.flattenToArray( object._objectMatrixArray );
  58. object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
  59. webglObject.render = true;
  60. }
  61. }
  62. }
  63. // render regular objects
  64. for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
  65. webglObject = renderList[ j ];
  66. if ( webglObject.render ) {
  67. object = webglObject.object;
  68. buffer = webglObject.buffer;
  69. _renderer.setObjectFaces( object );
  70. if ( object.customDepthMaterial ) {
  71. material = object.customDepthMaterial;
  72. } else if ( object.geometry.morphTargets.length ) {
  73. material = _depthMaterialMorph;
  74. } else {
  75. material = _depthMaterial;
  76. }
  77. if ( buffer instanceof THREE.BufferGeometry ) {
  78. _renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );
  79. } else {
  80. _renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );
  81. }
  82. }
  83. }
  84. // set matrices and render immediate objects
  85. renderList = scene.__webglObjectsImmediate;
  86. for ( j = 0, jl = renderList.length; j < jl; j ++ ) {
  87. webglObject = renderList[ j ];
  88. object = webglObject.object;
  89. if ( object.visible && object.castShadow ) {
  90. if( object.matrixAutoUpdate ) {
  91. object.matrixWorld.flattenToArray( object._objectMatrixArray );
  92. }
  93. object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
  94. _renderer.renderImmediateObject( camera, scene.__lights, fog, _depthMaterial, object );
  95. }
  96. }
  97. // restore GL state
  98. var clearColor = _renderer.getClearColor(),
  99. clearAlpha = _renderer.getClearAlpha();
  100. _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
  101. _gl.enable( _gl.BLEND );
  102. };
  103. };