gaussianblur 特效

This commit is contained in:
yhh
2020-06-23 17:36:39 +08:00
parent 7399b9f5ca
commit d7385654ef
12 changed files with 91 additions and 57 deletions

View File

@@ -95,7 +95,12 @@ class Scene extends egret.DisplayObjectContainer {
}
public begin() {
SceneManager.stage.addChildAt(this, 0);
if (SceneManager.sceneTransition){
SceneManager.stage.addChildAt(this, SceneManager.stage.numChildren - 1);
}else{
SceneManager.stage.addChild(this);
}
if (this._renderers.length == 0) {
this.addRenderer(new DefaultRenderer());
console.warn("场景开始时没有渲染器 自动添加DefaultRenderer以保证能够正常渲染");
@@ -180,7 +185,7 @@ class Scene extends egret.DisplayObjectContainer {
let isEven = MathHelper.isEven(enabledCounter);
enabledCounter ++;
this._postProcessors[i].process(this);
this._postProcessors[i].process();
}
}
}

View File

@@ -91,7 +91,7 @@ class SceneManager {
*/
public static startSceneTransition<T extends SceneTransition>(sceneTransition: T): T {
if (this.sceneTransition) {
console.error("在前一个场景完成之前,不能开始一个新的场景转换。");
console.warn("在前一个场景完成之前,不能开始一个新的场景转换。");
return;
}

View File

@@ -22,9 +22,9 @@ class GaussianBlurEffect extends egret.CustomFilter {
"uniform float _sampleWeights[SAMPLE_COUNT];\n" +
"void main(void) {\n" +
"vec4 c = 0;\n" +
"vec4 c = vec4(0, 0, 0, 0);\n" +
"for( int i = 0; i < SAMPLE_COUNT; i++ )\n" +
" c += texture2D( s0, texCoord + _sampleOffsets[i] ) * _sampleWeights[i];\n" +
" c += texture2D( uSampler, vTextureCoord + _sampleOffsets[i] ) * _sampleWeights[i];\n" +
"gl_FragColor = c;\n" +
"}";
private _sampleWeights: number[];
@@ -33,6 +33,7 @@ class GaussianBlurEffect extends egret.CustomFilter {
private _blurAmount = 2;
private _horizontalBlurDelta = 0.01;
private _verticalBlurDelta = 0.01;
private _sampleCount: number = 15;
public get blurAmount(){
return this._blurAmount;
@@ -94,7 +95,7 @@ class GaussianBlurEffect extends egret.CustomFilter {
this._sampleWeights[0] = this.computeGaussian(0);
let totalWeights = this._sampleWeights[0];
for (let i = 0; i < 15 / 2; i ++){
for (let i = 0; i < this._sampleCount / 2; i ++){
let weight = this.computeGaussian(i + 1);
this._sampleWeights[i * 2 + 1] = weight;
this._sampleWeights[i * 2 + 2] = weight;
@@ -110,9 +111,9 @@ class GaussianBlurEffect extends egret.CustomFilter {
}
private setBlurEffectParameters(dx: number, dy: number, offsets: Vector2[]){
for (let i = 0; i < 15 / 2; i ++){
for (let i = 0; i < this._sampleCount / 2; i ++){
let sampleOffset = i * 2 + 1.5;
let delta = Vector2.subtract( new Vector2(dx, dy), new Vector2(sampleOffset));
let delta = Vector2.multiply( new Vector2(dx, dy), new Vector2(sampleOffset));
offsets[i * 2 + 1] = delta;
offsets[i * 2 + 2] = new Vector2(-delta);

View File

@@ -12,17 +12,20 @@ class PostProcessor {
public onAddedToScene(scene: Scene){
this.scene = scene;
this.shape = new egret.Shape();
this.shape.graphics.beginFill(0xFFFFFF, 1);
this.shape.graphics.drawRect(0, 0, SceneManager.stage.stageWidth, SceneManager.stage.stageHeight);
this.shape.graphics.endFill();
scene.addChild(this.shape);
}
public process(source: egret.DisplayObject){
this.drawFullscreenQuad(source, this.effect);
public process(){
this.drawFullscreenQuad();
}
public onSceneBackBufferSizeChanged(newWidth: number, newHeight: number){}
protected drawFullscreenQuad(texture: egret.DisplayObject, effect: egret.CustomFilter = null){
texture.filters = [effect];
protected drawFullscreenQuad(){
this.shape.filters = [this.effect];
}
public unload(){

View File

@@ -25,12 +25,12 @@ class GaussianBlurPostProcessor extends PostProcessor {
effect.verticalBlurDelta = 1 / (this.scene.stage.stageHeight * this._renderTargetScale);
}
public process(source: egret.DisplayObject){
public process(){
let effect = this.effect as GaussianBlurEffect;
effect.prepareForHorizontalBlur();
this.drawFullscreenQuad(source, this.effect);
this.drawFullscreenQuad();
effect.prepareForVerticalBlur();
this.drawFullscreenQuad(source, this.effect);
this.drawFullscreenQuad();
}
}