Skip to content
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

Open
wants to merge 32 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9094de9
Create base html file for post-processing bloom example
enzofrancescaHM Jan 30, 2025
19f78b4
Create bloom.js for post-process bloom example
enzofrancescaHM Jan 30, 2025
868863a
Update index.html changing path
enzofrancescaHM Jan 30, 2025
22ad7d0
Update index.html to use importmap
enzofrancescaHM Jan 30, 2025
fbd5cef
Update bloom.js to use importmap
enzofrancescaHM Jan 30, 2025
d6b9d96
Update examples/post-process/index.html
enzofrancescaHM Jan 30, 2025
d86dd9f
Update examples/post-process/bloom.js
enzofrancescaHM Jan 30, 2025
2b409aa
Update bloom.js to discard useless wait
enzofrancescaHM Jan 30, 2025
5617d2f
Update index.html to set bloom directly on a-scene tag
enzofrancescaHM Jan 30, 2025
485fe53
Update index.html to fix typo and fix importmap paths
enzofrancescaHM Jan 31, 2025
f12edb5
Update bloom.js to fix various issues and to optimize code
enzofrancescaHM Jan 31, 2025
b8fc265
Rename examples/post-process/bloom.js to examples/showcase/post-proce…
enzofrancescaHM Jan 31, 2025
2c30d30
Rename examples/post-process/index.html to examples/showcase/post-pro…
enzofrancescaHM Jan 31, 2025
d1f9285
Update index.html to get rid of useless tags
enzofrancescaHM Jan 31, 2025
003bb43
Update bloom.js to use right value of delta
enzofrancescaHM Jan 31, 2025
c72fb8c
Update bloom.js to reflect better formatting of schema
enzofrancescaHM Jan 31, 2025
97c97f7
Update index.html to get rid of semicolon and trailing comma
enzofrancescaHM Jan 31, 2025
fbf8c44
Update bloom.js to implement multisampling
enzofrancescaHM Jan 31, 2025
53afd13
Update bloom.js to resize EffectComposer
enzofrancescaHM Jan 31, 2025
97d4fed
Update bloom.js with correct parameter in setSize
enzofrancescaHM Feb 1, 2025
3ecf142
Update index.html to get right position and raise red cube emissive
enzofrancescaHM Feb 1, 2025
b08a29d
Update bloom.js to fix distorsions in VR Mode
enzofrancescaHM Feb 1, 2025
cdc609c
Update bloom.js to add OutputPass, improving quality
enzofrancescaHM Feb 1, 2025
70ca6bd
Update bloom.js, removed useless parameter in OutputPass
enzofrancescaHM Feb 1, 2025
3c422ac
Update index.html, added toneMapping tag
enzofrancescaHM Feb 1, 2025
3276558
Update bloom.js, FullScreenQuad global patch
enzofrancescaHM Feb 1, 2025
4c2cb7c
Update index.html to list post-processing example
enzofrancescaHM Feb 1, 2025
0a342d0
Update bloom.js to get rid of reduntant parts already implemented in …
enzofrancescaHM Feb 1, 2025
eae775a
Update examples/showcase/post-processing/bloom.js
enzofrancescaHM Feb 2, 2025
379acfe
Update examples/showcase/post-processing/bloom.js
enzofrancescaHM Feb 2, 2025
4e4041f
Update examples/showcase/post-processing/bloom.js
enzofrancescaHM Feb 3, 2025
b954921
Updated bloom.js after lint:fix passed
Feb 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions examples/post-process/bloom.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/**
* Unreal Bloom Effect
* Implementation for A-Frame
* Code modified from Akbartus's UnrealBloomPass.js
* https://github.com/akbartus/A-Frame-Component-Postprocessing
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that the source is MIT licensed, the original copyright and license notice should be included.

*/

import AFRAME from "aframe";
import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js"; // This uses the same three instance.
import { RenderPass } from "three/addons/postprocessing/RenderPass.js"; // This uses the same three instance.
import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js"; // This uses the same three instance.
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved

/////////////////////////////////////
// A-FRAME COMPONENT: POST-PROCESSING //
/////////////////////////////////////
AFRAME.registerComponent("bloom", {
schema: {
threshold: {
type: "number",
default: 0,
},
strength: {
type: "number",
default: 0.4,
},
radius: {
type: "number",
default: 0,
},
exposure: {
type: "number",
default: 1,
},
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
},
init: function () {

this.scene = this.el.object3D;
this.renderer = this.el.renderer;
this.camera = this.el.camera;
this.bound = false;
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved

var that = this;

// delay half second to get the right resolution
setTimeout(function () {
that.evaluateEffect();
that.bind();
}, 500);
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
},
update: function (oldData) {
console.log("Post-processing UPDATE effect");
this.evaluateEffect();
},
evaluateEffect: function () {
this.scene = this.el.object3D;
this.renderer = this.el.renderer;
this.camera = this.el.camera;
this.composer = new EffectComposer(this.renderer);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of recreating EffectComposer, RenderPass and UnrealBloomPass each update, they can be created once in init and only updated here.

const renderScene = new RenderPass(this.scene, this.camera);
this.composer.addPass(renderScene);

// creating bloom pass
const bloomPass = new UnrealBloomPass(
new THREE.Vector2(
this.renderer.domElement.clientWidth,
this.renderer.domElement.clientHeight
),
1.5,
0.4,
0.85
);

bloomPass.threshold = this.data.threshold;
bloomPass.strength = this.data.strength;
bloomPass.radius = this.data.radius;
this.composer.addPass(bloomPass);
},
tick: function (t, dt) {
this.t = t;
this.dt = dt;
},
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
bind: function () {
const render = this.renderer.render;
const system = this;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nitpick: this isn't a system, probably better to name it self.

let isDigest = false;
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved

this.renderer.render = function () {

if (isDigest) {
render.apply(this, arguments);
} else {
isDigest = true;
if (system.occlusionComposer) {
system.occlusionComposer.render(system.dt);
} else {
system.composer.render(system.dt);
}
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
isDigest = false;
}

};

},
});
74 changes: 74 additions & 0 deletions examples/post-process/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<html>

<head>
<script type="importmap">
{
"imports": {
"aframe": "../../dist/aframe-master.module.min.js",
"three": "https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be

          "three": "../../../super-three-package/build/three.module.js",
          "three/addons/": "../../../super-three-package/examples/jsm/",

like https://github.com/aframevr/aframe/blob/master/examples/boilerplate/importmap/index.html
so it uses the three version from node_modules.

}
}
</script>
<script type="module" src="./bloom.js"></script>;

<meta charset="utf-8">
<title>Post Processing Bloom A-Frame Demo</title>
<meta name="description" content="Post Processing Bloom Demo">

</head>

<body>

<a-scene
reflection="directionalLight:#sun;"
ßshadow="type: pcfsoft; autoUpdate: true"
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
background="color:black;"
renderer="anisotropy:4; stencil:true; alpha:false; colorManagement:true; exposure:1.0;">

<a-entity id="pov-camera" position="0 1.6 2" rotation="3.323 -8.136 0" camera="" look-controls="" wasd-controls="" data-aframe-inspector-original-camera=""></a-entity>

<a-box id="boxemissivewhite" shadow="cast:false; receive:false" position="1 1.720 -1" rotation="0 0 0"
scale="0.2 0.2 0.2" color="#FFFFFF" material="emissive: #FFF; emissiveIntensity:4;"></a-box>

<a-box id="boxemissivegreen" shadow="cast:false; receive:false" position="0 1.720 -1" rotation="0 0 0"
scale="0.2 0.2 0.2" color="#00FF00" material="emissive: #0F0; emissiveIntensity:4;"></a-box>

<a-box id="boxemissivered" shadow="cast: false; receive: false" position="-1 1.720 -1" rotation=""
scale="0.2 0.2 0.2" color="#FF0000" material="emissive: #F00; emissiveIntensity: 4"></a-box>

<a-box id="boxwhite" shadow="cast:false; receive:false" position="1 1 -1" rotation="0 0 0"
scale="0.2 0.2 0.2" color="#FFFFFF" material="emissive: #FFF; emissiveIntensity:0;"></a-box>

<a-box id="boxgreen" shadow="cast:false; receive:false" position="0 1 -1" rotation="0 0 0"
scale="0.2 0.2 0.2" color="#00FF00" material="emissive: #0F0; emissiveIntensity:0;"></a-box>

<a-box id="boxred" shadow="cast: false; receive: false" position="-1 1 -1" rotation=""
scale="0.2 0.2 0.2" color="#FF0000" material="emissive: #F00; emissiveIntensity:0;"></a-box>

<a-box id="pulsingneon" shadow="cast:false; receive:false" position="0 1.250 -1" rotation="0 0 0"
scale="2 0.1 0.1" color="#FF00FF" material="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"shadow></a-plane>

<a-entity id="sun" radius="0.5" color="#FFD"
light="type: directional; intensity:2.6; color: #FFD; shadowBias: -0.00001; castShadow: true; shadowCameraRight: 7.9; shadowMapHeight: 2048; shadowMapWidth: 2048;"
position="0.12 5.76 -2.14" rotation="0 0 0">
</a-entity>

</a-scene>

<script>
// intercept the scene loaded event
document.querySelector('a-scene').addEventListener('loaded', function () {
enzofrancescaHM marked this conversation as resolved.
Show resolved Hide resolved
// get the scene
var scene = document.querySelector('a-scene');
// add the bloom effect
scene.setAttribute('bloom', {threshold: 1.0, strength: 0.6, radius: 1, exposure: 1.0});
});
</script>

</body>

</html>