物管理前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.3 KiB

  1. (function () {
  2. class MaskPass extends THREE.Pass {
  3. constructor(scene, camera) {
  4. super();
  5. this.scene = scene;
  6. this.camera = camera;
  7. this.clear = true;
  8. this.needsSwap = false;
  9. this.inverse = false;
  10. }
  11. render(
  12. renderer,
  13. writeBuffer,
  14. readBuffer
  15. /*, deltaTime, maskActive */
  16. ) {
  17. const context = renderer.getContext();
  18. const state = renderer.state; // don't update color or depth
  19. state.buffers.color.setMask(false);
  20. state.buffers.depth.setMask(false); // lock buffers
  21. state.buffers.color.setLocked(true);
  22. state.buffers.depth.setLocked(true); // set up stencil
  23. let writeValue, clearValue;
  24. if (this.inverse) {
  25. writeValue = 0;
  26. clearValue = 1;
  27. } else {
  28. writeValue = 1;
  29. clearValue = 0;
  30. }
  31. state.buffers.stencil.setTest(true);
  32. state.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);
  33. state.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff);
  34. state.buffers.stencil.setClear(clearValue);
  35. state.buffers.stencil.setLocked(true); // draw into the stencil buffer
  36. renderer.setRenderTarget(readBuffer);
  37. if (this.clear) renderer.clear();
  38. renderer.render(this.scene, this.camera);
  39. renderer.setRenderTarget(writeBuffer);
  40. if (this.clear) renderer.clear();
  41. renderer.render(this.scene, this.camera); // unlock color and depth buffer for subsequent rendering
  42. state.buffers.color.setLocked(false);
  43. state.buffers.depth.setLocked(false); // only render where stencil is set to 1
  44. state.buffers.stencil.setLocked(false);
  45. state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff); // draw if == 1
  46. state.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);
  47. state.buffers.stencil.setLocked(true);
  48. }
  49. }
  50. class ClearMaskPass extends THREE.Pass {
  51. constructor() {
  52. super();
  53. this.needsSwap = false;
  54. }
  55. render(
  56. renderer
  57. /*, writeBuffer, readBuffer, deltaTime, maskActive */
  58. ) {
  59. renderer.state.buffers.stencil.setLocked(false);
  60. renderer.state.buffers.stencil.setTest(false);
  61. }
  62. }
  63. THREE.ClearMaskPass = ClearMaskPass;
  64. THREE.MaskPass = MaskPass;
  65. })();