ShaderPass.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. ;(function () {
  2. class ShaderPass extends THREE.Pass {
  3. constructor(shader, textureID) {
  4. super()
  5. this.textureID = textureID !== undefined ? textureID : 'tDiffuse'
  6. if (shader instanceof THREE.ShaderMaterial) {
  7. this.uniforms = shader.uniforms
  8. this.material = shader
  9. } else if (shader) {
  10. this.uniforms = THREE.UniformsUtils.clone(shader.uniforms)
  11. this.material = new THREE.ShaderMaterial({
  12. defines: Object.assign({}, shader.defines),
  13. uniforms: this.uniforms,
  14. vertexShader: shader.vertexShader,
  15. fragmentShader: shader.fragmentShader,
  16. })
  17. }
  18. this.fsQuad = new THREE.FullScreenQuad(this.material)
  19. }
  20. render(
  21. renderer,
  22. writeBuffer,
  23. readBuffer
  24. /*, deltaTime, maskActive */
  25. ) {
  26. if (this.uniforms[this.textureID]) {
  27. this.uniforms[this.textureID].value = readBuffer.texture
  28. }
  29. this.fsQuad.material = this.material
  30. if (this.renderToScreen) {
  31. renderer.setRenderTarget(null)
  32. this.fsQuad.render(renderer)
  33. } else {
  34. renderer.setRenderTarget(writeBuffer) // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600
  35. if (this.clear) renderer.clear(renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil)
  36. this.fsQuad.render(renderer)
  37. }
  38. }
  39. }
  40. THREE.ShaderPass = ShaderPass
  41. })()