MaskPass.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. })()