diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 30043ab..0644835 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,7 +176,6 @@ } // if the uvs have not updated then no point rendering just yet! - this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -206,6 +205,7 @@ { gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); } + this.renderer.blendModeManager.setBlendMode(container.blendMode, baseTexture.premultipliedAlpha); // now lets upload and render the buffers.. for (var i = 0, j = 0; i < totalChildren; i += batchSize, j += 1) diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 30043ab..0644835 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,7 +176,6 @@ } // if the uvs have not updated then no point rendering just yet! - this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -206,6 +205,7 @@ { gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); } + this.renderer.blendModeManager.setBlendMode(container.blendMode, baseTexture.premultipliedAlpha); // now lets upload and render the buffers.. for (var i = 0, j = 0; i < totalChildren; i += batchSize, j += 1) diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index 05258f6..0802e88 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -552,7 +552,7 @@ { this.blendModes = {}; - this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.ADD] = [gl.SRC_ALPHA, gl.DST_ALPHA]; this.blendModes[CONST.BLEND_MODES.MULTIPLY] = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.SRC_ALPHA, gl.ONE]; diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 30043ab..0644835 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,7 +176,6 @@ } // if the uvs have not updated then no point rendering just yet! - this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -206,6 +205,7 @@ { gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); } + this.renderer.blendModeManager.setBlendMode(container.blendMode, baseTexture.premultipliedAlpha); // now lets upload and render the buffers.. for (var i = 0, j = 0; i < totalChildren; i += batchSize, j += 1) diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index 05258f6..0802e88 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -552,7 +552,7 @@ { this.blendModes = {}; - this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.ADD] = [gl.SRC_ALPHA, gl.DST_ALPHA]; this.blendModes[CONST.BLEND_MODES.MULTIPLY] = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.SRC_ALPHA, gl.ONE]; diff --git a/src/core/renderers/webgl/managers/BlendModeManager.js b/src/core/renderers/webgl/managers/BlendModeManager.js index 0112a9d..a928031 100644 --- a/src/core/renderers/webgl/managers/BlendModeManager.js +++ b/src/core/renderers/webgl/managers/BlendModeManager.js @@ -14,6 +14,7 @@ * @member {number} */ this.currentBlendMode = 99999; + this.currentSourcePremultiplied = true; } BlendModeManager.prototype = Object.create(WebGLManager.prototype); @@ -26,17 +27,25 @@ * @param blendMode {number} the blendMode, should be a Pixi const, such as `PIXI.BLEND_MODES.ADD`. See * {@link PIXI.BLEND_MODES} for possible values. */ -BlendModeManager.prototype.setBlendMode = function (blendMode) +BlendModeManager.prototype.setBlendMode = function (blendMode, isSourcePremultiplied) { - if (this.currentBlendMode === blendMode) + if (typeof isSourcePremultiplied === "undefined") { + isSourcePremultiplied = true; + } + if (this.currentBlendMode === blendMode && + this.currentSourcePremultiplied == isSourcePremultiplied) { return false; } this.currentBlendMode = blendMode; + this.currentSourcePremultiplied = isSourcePremultiplied; var mode = this.renderer.blendModes[this.currentBlendMode]; - this.renderer.gl.blendFunc(mode[0], mode[1]); - + var gl = this.renderer.gl; + if (isSourcePremultiplied && mode[0] == gl.SRC_ALPHA) + gl.blendFunc(gl.ONE, mode[1]); + else + gl.blendFunc(mode[0], mode[1]); return true; }; diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 30043ab..0644835 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,7 +176,6 @@ } // if the uvs have not updated then no point rendering just yet! - this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -206,6 +205,7 @@ { gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); } + this.renderer.blendModeManager.setBlendMode(container.blendMode, baseTexture.premultipliedAlpha); // now lets upload and render the buffers.. for (var i = 0, j = 0; i < totalChildren; i += batchSize, j += 1) diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index 05258f6..0802e88 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -552,7 +552,7 @@ { this.blendModes = {}; - this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.NORMAL] = [gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.ADD] = [gl.SRC_ALPHA, gl.DST_ALPHA]; this.blendModes[CONST.BLEND_MODES.MULTIPLY] = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.SRC_ALPHA, gl.ONE]; diff --git a/src/core/renderers/webgl/managers/BlendModeManager.js b/src/core/renderers/webgl/managers/BlendModeManager.js index 0112a9d..a928031 100644 --- a/src/core/renderers/webgl/managers/BlendModeManager.js +++ b/src/core/renderers/webgl/managers/BlendModeManager.js @@ -14,6 +14,7 @@ * @member {number} */ this.currentBlendMode = 99999; + this.currentSourcePremultiplied = true; } BlendModeManager.prototype = Object.create(WebGLManager.prototype); @@ -26,17 +27,25 @@ * @param blendMode {number} the blendMode, should be a Pixi const, such as `PIXI.BLEND_MODES.ADD`. See * {@link PIXI.BLEND_MODES} for possible values. */ -BlendModeManager.prototype.setBlendMode = function (blendMode) +BlendModeManager.prototype.setBlendMode = function (blendMode, isSourcePremultiplied) { - if (this.currentBlendMode === blendMode) + if (typeof isSourcePremultiplied === "undefined") { + isSourcePremultiplied = true; + } + if (this.currentBlendMode === blendMode && + this.currentSourcePremultiplied == isSourcePremultiplied) { return false; } this.currentBlendMode = blendMode; + this.currentSourcePremultiplied = isSourcePremultiplied; var mode = this.renderer.blendModes[this.currentBlendMode]; - this.renderer.gl.blendFunc(mode[0], mode[1]); - + var gl = this.renderer.gl; + if (isSourcePremultiplied && mode[0] == gl.SRC_ALPHA) + gl.blendFunc(gl.ONE, mode[1]); + else + gl.blendFunc(mode[0], mode[1]); return true; }; diff --git a/src/core/sprites/webgl/SpriteRenderer.js b/src/core/sprites/webgl/SpriteRenderer.js index f68d03a..39c6612 100644 --- a/src/core/sprites/webgl/SpriteRenderer.js +++ b/src/core/sprites/webgl/SpriteRenderer.js @@ -339,7 +339,7 @@ if (blendSwap) { currentBlendMode = nextBlendMode; - this.renderer.blendModeManager.setBlendMode( currentBlendMode ); + this.renderer.blendModeManager.setBlendMode( currentBlendMode, currentBaseTexture.premultipliedAlpha ); } if (shaderSwap)