Advertisement
Guest User

Untitled

a guest
May 30th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. const THREE = require('three')
  2. const EffectComposer = require('three-effectcomposer')(THREE)
  3.  
  4. class ClearPass {
  5. constructor () {
  6. this.scene = new THREE.Scene()
  7. this.camera = new THREE.PerspectiveCamera()
  8. this.enabled = true
  9. this.needsSwap = true
  10. }
  11.  
  12. render (renderer, writeBuffer) {
  13. renderer.render(this.scene, this.camera, writeBuffer)
  14. }
  15. }
  16.  
  17. class EnsembleAveragePass {
  18. constructor (target, repeat) {
  19. this.target = target
  20. this.uniforms = THREE.UniformsUtils.clone({
  21. accBuffer: {type: 't', value: null},
  22. newBuffer: {type: 't', value: null},
  23. scale: {type: 'f', value: 1 / repeat}
  24. })
  25. this.material = new THREE.ShaderMaterial({
  26. uniforms: this.uniforms,
  27. vertexShader: `
  28. varying vec2 vUv;
  29. void main() {
  30. vUv = uv;
  31. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  32. }
  33. `,
  34. fragmentShader: `
  35. uniform sampler2D accBuffer;
  36. uniform sampler2D newBuffer;
  37. uniform float scale;
  38. varying vec2 vUv;
  39. void main() {
  40. vec4 accColor = texture2D(accBuffer, vUv);
  41. vec4 newColor = texture2D(newBuffer, vUv) * scale;
  42. newColor.a = 1.0;
  43. gl_FragColor = accColor + newColor;
  44. }
  45. `
  46. })
  47. this.enabled = true
  48. this.needsSwap = true
  49. }
  50.  
  51. render (renderer, writeBuffer, readBuffer) {
  52. this.uniforms.accBuffer.value = readBuffer
  53. this.uniforms.newBuffer.value = this.target.readBuffer
  54. EffectComposer.quad.material = this.material
  55. if (this.renderToScreen) {
  56. renderer.render(EffectComposer.scene, EffectComposer.camera)
  57. } else {
  58. renderer.render(EffectComposer.scene, EffectComposer.camera, writeBuffer, true)
  59. }
  60. }
  61. }
  62.  
  63. class EnsembleScenePass {
  64. constructor (scene, camera) {
  65. this.scene = scene
  66. this.camera = camera
  67. this.enabled = true
  68. this.needsSwap = false
  69. }
  70.  
  71. render (renderer, writeBuffer) {
  72. this.readBuffer = writeBuffer.clone()
  73. renderer.render(this.scene, this.camera, this.readBuffer, true)
  74. }
  75. }
  76.  
  77. const renderer = new THREE.WebGLRenderer()
  78. renderer.setSize(window.innerWidth, window.innerHeight)
  79. document.body.appendChild(renderer.domElement)
  80.  
  81. const camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000)
  82. camera.position.z = 400
  83.  
  84. const composer = new EffectComposer(renderer)
  85. composer.addPass(new ClearPass())
  86.  
  87. const repeat = 10
  88. for (let j = 0; j < repeat; ++j) {
  89. const scene = new THREE.Scene()
  90. scene.fog = new THREE.Fog(0x000000, 1, 1000)
  91.  
  92. const object = new THREE.Object3D()
  93. scene.add(object)
  94.  
  95. const geometry = new THREE.SphereGeometry(1, 4, 4)
  96. const material = new THREE.MeshPhongMaterial({
  97. color: 0xffffff,
  98. shading: THREE.FlatShading
  99. })
  100.  
  101. for (let i = 0; i < 100; i++) {
  102. const mesh = new THREE.Mesh(geometry, material)
  103. mesh.position.set(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).normalize()
  104. mesh.position.multiplyScalar(Math.random() * 400)
  105. mesh.rotation.set(Math.random() * 2, Math.random() * 2, Math.random() * 2)
  106. mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 50
  107. object.add(mesh)
  108. }
  109.  
  110. scene.add(new THREE.AmbientLight(0x222222))
  111.  
  112. const light = new THREE.DirectionalLight(0xffffff)
  113. light.position.set(1, 1, 1)
  114. scene.add(light)
  115.  
  116. const target = new EnsembleScenePass(scene, camera)
  117. composer.addPass(target)
  118. const effect = new EnsembleAveragePass(target, repeat)
  119. if (j === repeat - 1) {
  120. effect.renderToScreen = true
  121. }
  122. composer.addPass(effect)
  123. }
  124.  
  125. const render = () => {
  126. window.requestAnimationFrame(render)
  127. composer.render()
  128. }
  129.  
  130. render()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement