Post fx pipeline
Introduction¶
Post fx pipelines for game objects or camera. A game object or a camera can stack many post-fx effect.
- Author: Richard Davey
WebGL only
All kinds of post fx pipelines only work in WebGL render mode.
Usage¶
Post fx pipeline class¶
class MyPostFxClass extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline {
constructor(game) {
super({
game: game,
renderTarget: true,
fragShader: '...', // GLSL shader
uniforms: []
});
}
onPreRender() {
this.set1f('intensity', this._intensity);
}
onDraw(renderTarget) {
}
}
Set uniform values¶
- Property with 1 value
- Float
pipelineInstance.set1f(name, value0); // pipelineInstance.set1f(name, value0, shader); - uniform1fv
pipelineInstance.set1fv(name, value0); // pipelineInstance.set1fv(name, value0, shader); - Int
pipelineInstance.set1i(name, value0); // pipelineInstance.set1i(name, value0, shader);
- Float
- Property with 2 values
- Float
pipelineInstance.set2f(name, value0, value1); // pipelineInstance.set2f(name, value0, value1, shader); - uniform2fv
pipelineInstance.set2fv(name, value0, value1); // pipelineInstance.set2fv(name, value0, value1, shader); - Int
pipelineInstance.set2i(name, value0, value1); // pipelineInstance.set2i(name, value0, value1, shader);
- Float
- Property with 3 value
- Float
pipelineInstance.set3f(name, value0, value1, value2); // pipelineInstance.set3f(name, value0, value1, value2, shader); - uniform3fv
pipelineInstance.set3fv(name, value0, value1, value2); // pipelineInstance.set3fv(name, value0, value1, value2, shader); - Int
pipelineInstance.set3i(name, value0, value1, value2); // pipelineInstance.set3i(name, value0, value1, value2, shader);
- Float
- Property with 4 values
- Float
pipelineInstance.set4f(name, value0, value1, value2, value3); // pipelineInstance.set4f(name, value0, value1, value2, value3, shader); - uniform4fv
pipelineInstance.set4fv(name, value0, value1, value2, value3); // pipelineInstance.set4fv(name, value0, value1, value2, value3, shader); - Int
pipelineInstance.set4i(name, value0, value1, value2, value3); // pipelineInstance.set4i(name, value0, value1, value2, value3, shader);
- Float
onPreRender¶
- Set uniform values in
onPreRendermethod.
onDraw¶
- Ping-pong drawing
- Variables :
renderTarget: Render target, parameter ofonDrawmethod.pipelineInstance.fullFrame1,pipelineInstance.fullFrame2: Ping-pong render texture.
- Steps
- Copy frame to
pipelineInstance.fullFrame1pipelineInstance.copyFrame(source, target); // pipelineInstance.copyFrame(source, target, brightness, clear, clearAlpha); - Set uniform values
- Bind and draw on
pipelineInstance.fullFrame1,pipelineInstance.fullFrame2.pipelineInstance.bindAndDraw(source, target); // pipelineInstance.bindAndDraw(source, target, clear, clearAlpha, shader); - Draw result back
pipelineInstance.bindAndDraw(source);
- Copy frame to
- Variables :
Register post-fx pipeline¶
- Register post-fx pipeline in game config
import MyPostFxClass from 'path'; var config = { // ... pipeline: [MyPostFxClass] // ... }; var game = new Phaser.Game(config); - Or register post-fx pipeline at runtime
var pipelineManager = scene.sys.renderer.pipelines; pipelineManager.addPostPipeline(PostFxName, MyPostFxClass);
Apply effect¶
gameObject.setPostPipeline(MyPostFxClass);
camera.setPostPipeline(MyPostFxClass);
Will create an effect instance then push it into postPipelines list.
Get post-fx pipeline¶
var pipelineInstance = gameObject.getPostPipeline(MyPostFxClass);
var pipelineInstance = camera.getPostPipeline(MyPostFxClass);
Remove post-fx pipeline¶
gameObject.removePostPipeline(MyPostFxClass);
camera.removePostPipeline(MyPostFxClass);
Unregister post-fx pipeline¶
var pipelineManager = scene.sys.renderer.pipelines;
pipelineManager.remove(PostFxName);
Color matrix¶
Use color martix to change RGB render result, and more...
class MyPostFxClass extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline {
constructor(game) {
super({
game: game,
renderTarget: true,
fragShader: '...', // GLSL shader
uniforms: []
});
}
onPreRender() {
// this.set1f('intensity', this._intensity);
this.colorMatrix.grayscale(this._intensity);
}
onDraw(renderTarget) {
this.colorMatrix.grayscale(this._intensity);
this.drawFrame(renderTarget, this.fullFrame1);
this.bindAndDraw(this.fullFrame1);
}
}
Color adjusting¶
Invoke before drawFrame().
- Grayscale
this.colorMatrix.grayscale(value); // this.colorMatrix.grayscale(value, true); // Cascadevalue:0~1
- Night vision tone
this.colorMatrix.night(value); // this.colorMatrix.night(value, true); // Cascadevalue:0~1
- Sepia tone
this.colorMatrix.sepia(); // this.colorMatrix.sepia(true); // Cascade - Trippy color tone
this.colorMatrix.lsd(); // this.colorMatrix.lsd(true); // Cascade - Brown tone
this.colorMatrix.brown(); // this.colorMatrix.brown(true); // Cascade - Vintage pinhole color effect
this.colorMatrix.vintagePinhole(); // this.colorMatrix.vintagePinhole(true); // Cascade - Kodachrome color effect
this.colorMatrix.kodachrome(); // this.colorMatrix.kodachrome(true); // Cascade - Technicolor color effect
this.colorMatrix.technicolor(); // this.colorMatrix.technicolor(true); // Cascade - Polaroid color effect
this.colorMatrix.polaroid(); // this.colorMatrix.polaroid(true); // Cascade - Brightness
this.colorMatrix.brightness(value); // this.colorMatrix.brightness(value, true); // Cascadevalue:0(black) ~1
- Saturation
this.colorMatrix.saturate(value); // this.colorMatrix.saturate(value, true); // Cascadevalue:-1~1
- Desaturate
this.colorMatrix.desaturate(); // this.colorMatrix.desaturate(true); // Cascade - Hue
this.colorMatrix.hue(rotation); // this.colorMatrix.hue(rotation, true); // Cascaderotation: Hue rotation, in degree.
- Black and white
this.colorMatrix.blackWhite(); // this.colorMatrix.blackWhite(true); // Cascade - Negative
this.colorMatrix.negative(); // this.colorMatrix.negative(true); // Cascade - Contrast
this.colorMatrix.contrast(value); // this.colorMatrix.contrast(value, true); // Cascade - Desaturate luminance
this.colorMatrix.desaturateLuminance(); // this.colorMatrix.desaturateLuminance(true); // Cascade - Shifts RGB to BGR order
this.colorMatrix.shiftToBGR(); // this.colorMatrix.shiftToBGR(true); // Cascade
Draw¶
Invoke under onDraw(renderTarget).
this.drawFrame(renderTarget, this.fullFrame1);
this.bindAndDraw(this.fullFrame1);