-
-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Post-Process example #5648
base: master
Are you sure you want to change the base?
Post-Process example #5648
Changes from 27 commits
9094de9
19f78b4
868863a
22ad7d0
fbd5cef
d6b9d96
d86dd9f
2b409aa
5617d2f
485fe53
f12edb5
b8fc265
2c30d30
d1f9285
003bb43
c72fb8c
97c97f7
fbf8c44
53afd13
97d4fed
3ecf142
b08a29d
cdc609c
70ca6bd
3c422ac
3276558
4c2cb7c
0a342d0
eae775a
379acfe
4e4041f
b954921
ec757df
3c73498
448ea27
cce2821
4570f97
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
/* global THREE */ | ||
/** | ||
* Unreal Bloom Effect | ||
* Implementation for A-Frame | ||
* Code modified from Akbartus's post-processing A-Frame integration | ||
* https://github.com/akbartus/A-Frame-Component-Postprocessing | ||
*/ | ||
|
||
import AFRAME from "aframe"; | ||
import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js"; | ||
import { RenderPass } from "three/addons/postprocessing/RenderPass.js"; | ||
import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js"; | ||
import { OutputPass } from "three/addons/postprocessing/OutputPass.js"; | ||
import { FullScreenQuad } from "three/addons/postprocessing/Pass.js"; | ||
|
||
// Disable XR projection for fullscreen effects | ||
// https://github.com/mrdoob/three.js/pull/26160 | ||
const _render = FullScreenQuad.prototype.render; | ||
FullScreenQuad.prototype.render = function (renderer) { | ||
const xrEnabled = renderer.xr.enabled; | ||
renderer.xr.enabled = false; | ||
_render.apply(this, arguments); | ||
renderer.xr.enabled = xrEnabled; | ||
}; | ||
|
||
AFRAME.registerComponent("bloom", { | ||
schema: { | ||
threshold: { type: "number", default: 1 }, | ||
strength: { type: "number", default: 0.5 }, | ||
radius: { type: "number", default: 1 }, | ||
}, | ||
events: { | ||
rendererresize: function () { | ||
this.renderer.getSize(this.size); | ||
this.composer.setSize(this.size.width, this.size.height); | ||
}, | ||
"enter-vr": function () { | ||
this.renderer.getSize(this.size); | ||
this.composer.setSize(this.size.width, this.size.height); | ||
}, | ||
}, | ||
init() { | ||
enzofrancescaHM marked this conversation as resolved.
Show resolved
Hide resolved
|
||
this.size = new THREE.Vector2(); | ||
this.scene = this.el.object3D; | ||
this.renderer = this.el.renderer; | ||
this.camera = this.el.camera; | ||
this.bind(); | ||
}, | ||
update: function () { | ||
if (this.composer) { | ||
this.composer.dispose(); | ||
} | ||
// create composer with multisampling to avoid aliasing | ||
const resolution = this.renderer.getDrawingBufferSize(new THREE.Vector2()); | ||
const renderTarget = new THREE.WebGLRenderTarget( | ||
resolution.width, | ||
resolution.height, | ||
{ type: THREE.HalfFloatType, samples: 8 } | ||
); | ||
|
||
this.composer = new EffectComposer(this.renderer, renderTarget); | ||
|
||
// create render pass | ||
const renderScene = new RenderPass(this.scene, this.camera); | ||
this.composer.addPass(renderScene); | ||
|
||
// create bloom pass | ||
const strength = this.data.strength; | ||
const radius = this.data.radius; | ||
const threshold = this.data.threshold; | ||
if (this.bloomPass) { | ||
this.bloomPass.dispose(); | ||
} | ||
this.bloomPass = new UnrealBloomPass( | ||
resolution, | ||
strength, | ||
radius, | ||
threshold | ||
); | ||
this.composer.addPass(this.bloomPass); | ||
|
||
// create output pass | ||
if (this.outputPass) { | ||
this.outputPass.dispose(); | ||
} | ||
this.outputPass = new OutputPass(); | ||
this.composer.addPass(this.outputPass); | ||
}, | ||
|
||
bind: function () { | ||
this.originalRender = this.el.renderer.render; | ||
const self = this; | ||
let isInsideComposerRender = false; | ||
|
||
this.el.renderer.render = function () { | ||
if (isInsideComposerRender) { | ||
self.originalRender.apply(this, arguments); | ||
} else { | ||
isInsideComposerRender = true; | ||
self.composer.render(self.el.sceneEl.delta / 1000); | ||
isInsideComposerRender = false; | ||
} | ||
}; | ||
}, | ||
|
||
remove() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should be There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah. I can edit the PR directly too. Deliberate to make people do the changes. Especially first-time contributors :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. omg I always wondered how folks made suggestions, I saw that only on a few PRs, I never saw that icon myself, no idea to look at the style toolbar for it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think only owners of a repo can add commits to a PR but not 100% sure There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes obviously, but where and how? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh like this https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm reading the doc again, it's been years since I read those pages. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I just edit the file on the PR directly on Github. living on the edge 😅 |
||
this.el.renderer.render = this.originalRender; | ||
this.bloomPass.dispose(); | ||
this.outputPass.dispose(); | ||
this.composer.dispose(); | ||
}, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. extra comma |
||
}); | ||
enzofrancescaHM marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
enzofrancescaHM marked this conversation as resolved.
Show resolved
Hide resolved
|
||
<head> | ||
<meta charset="utf-8" /> | ||
<title>Post Processing Bloom Effect</title> | ||
<meta name="description" content="Post Processing Bloom Effect • A-Frame" /> | ||
<script type="importmap"> | ||
{ | ||
"imports": { | ||
"aframe": "../../dist/aframe-master.module.min.js", | ||
"three": "../../../super-three-package/build/three.module.js", | ||
"three/addons/": "../../../super-three-package/examples/jsm/" | ||
} | ||
} | ||
</script> | ||
<script type="module" src="./bloom.js"></script> | ||
</head> | ||
|
||
<body> | ||
<a-scene | ||
background="color: black" | ||
renderer="toneMapping: ACESFilmic" | ||
bloom="threshold: 1.0; strength: 0.5; radius: 1" | ||
> | ||
<a-entity id="rig" position="0 0 2"> | ||
<a-entity | ||
id="camera" | ||
position="0 1.6 0" | ||
camera | ||
look-controls | ||
wasd-controls | ||
></a-entity> | ||
</a-entity> | ||
|
||
<a-box | ||
id="boxemissivewhite" | ||
position="1 1.7 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #FFF; emissive: #FFF; emissiveIntensity: 4" | ||
></a-box> | ||
|
||
<a-box | ||
id="boxemissivegreen" | ||
position="0 1.7 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #0F0; emissive: #0F0; emissiveIntensity: 4" | ||
></a-box> | ||
|
||
<a-box | ||
id="boxemissivered" | ||
position="-1 1.7 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #F00; emissive: #F00; emissiveIntensity: 5" | ||
></a-box> | ||
|
||
<a-box | ||
id="boxwhite" | ||
position="1 1 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #FFF; emissive: #FFF; emissiveIntensity: 0" | ||
></a-box> | ||
|
||
<a-box | ||
id="boxgreen" | ||
position="0 1 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #0F0;emissive: #0F0; emissiveIntensity: 0" | ||
></a-box> | ||
|
||
<a-box | ||
id="boxred" | ||
position="-1 1 -1" | ||
scale="0.2 0.2 0.2" | ||
material="color: #F00; emissive: #F00; emissiveIntensity: 0" | ||
></a-box> | ||
|
||
<a-box | ||
id="pulsingneon" | ||
position="0 1.25 -1" | ||
scale="2 0.1 0.1" | ||
material="color: #F0F; emissive: #F0F; emissiveIntensity: 2.5" | ||
animation="property: material.emissiveIntensity; from: 2.5; to: 3.5; dir: alternate; dur: 2000; easing: linear; loop: true" | ||
></a-box> | ||
|
||
<a-plane | ||
id="plane" | ||
position="0 0.2 -4" | ||
rotation="-90 0 0" | ||
width="40" | ||
height="40" | ||
color="#111111" | ||
></a-plane> | ||
|
||
<a-entity | ||
id="sun" | ||
light="type: directional; intensity: 2.6; color: #FFD" | ||
position="0.12 5.76 -2.14" | ||
> | ||
</a-entity> | ||
</a-scene> | ||
</body> | ||
</html> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need to add
(bloom effect)
for simplicity