diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 0644835..30043ab 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,6 +176,7 @@ } // if the uvs have not updated then no point rendering just yet! + this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -205,7 +206,6 @@ { 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 0644835..30043ab 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,6 +176,7 @@ } // if the uvs have not updated then no point rendering just yet! + this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -205,7 +206,6 @@ { 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 30034dc..fdd49f7 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -540,7 +540,7 @@ }; /** - * Maps Pixi blend modes to WebGL blend modes. + * Maps Pixi blend modes to WebGL blend modes. It works only for pre-multiplied textures. * * @private */ @@ -552,10 +552,10 @@ { this.blendModes = {}; - 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.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.ADD] = [gl.ONE, 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_MINUS_SRC_COLOR]; + this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.ONE, gl.ONE_MINUS_SRC_COLOR]; this.blendModes[CONST.BLEND_MODES.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 0644835..30043ab 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,6 +176,7 @@ } // if the uvs have not updated then no point rendering just yet! + this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -205,7 +206,6 @@ { 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 30034dc..fdd49f7 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -540,7 +540,7 @@ }; /** - * Maps Pixi blend modes to WebGL blend modes. + * Maps Pixi blend modes to WebGL blend modes. It works only for pre-multiplied textures. * * @private */ @@ -552,10 +552,10 @@ { this.blendModes = {}; - 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.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.ADD] = [gl.ONE, 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_MINUS_SRC_COLOR]; + this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.ONE, gl.ONE_MINUS_SRC_COLOR]; this.blendModes[CONST.BLEND_MODES.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; diff --git a/src/core/renderers/webgl/managers/BlendModeManager.js b/src/core/renderers/webgl/managers/BlendModeManager.js index b6eb6e1..0112a9d 100644 --- a/src/core/renderers/webgl/managers/BlendModeManager.js +++ b/src/core/renderers/webgl/managers/BlendModeManager.js @@ -14,7 +14,6 @@ * @member {number} */ this.currentBlendMode = 99999; - this.currentSourcePremultiplied = true; } BlendModeManager.prototype = Object.create(WebGLManager.prototype); @@ -27,27 +26,17 @@ * @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, isSourcePremultiplied) +BlendModeManager.prototype.setBlendMode = function (blendMode) { - if (typeof isSourcePremultiplied === 'undefined') { - isSourcePremultiplied = true; - } - if (this.currentBlendMode === blendMode && - this.currentSourcePremultiplied === isSourcePremultiplied) + if (this.currentBlendMode === blendMode) { return false; } this.currentBlendMode = blendMode; - this.currentSourcePremultiplied = isSourcePremultiplied; var mode = this.renderer.blendModes[this.currentBlendMode]; - 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]); - } + this.renderer.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 0644835..30043ab 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,6 +176,7 @@ } // if the uvs have not updated then no point rendering just yet! + this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -205,7 +206,6 @@ { 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 30034dc..fdd49f7 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -540,7 +540,7 @@ }; /** - * Maps Pixi blend modes to WebGL blend modes. + * Maps Pixi blend modes to WebGL blend modes. It works only for pre-multiplied textures. * * @private */ @@ -552,10 +552,10 @@ { this.blendModes = {}; - 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.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.ADD] = [gl.ONE, 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_MINUS_SRC_COLOR]; + this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.ONE, gl.ONE_MINUS_SRC_COLOR]; this.blendModes[CONST.BLEND_MODES.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; diff --git a/src/core/renderers/webgl/managers/BlendModeManager.js b/src/core/renderers/webgl/managers/BlendModeManager.js index b6eb6e1..0112a9d 100644 --- a/src/core/renderers/webgl/managers/BlendModeManager.js +++ b/src/core/renderers/webgl/managers/BlendModeManager.js @@ -14,7 +14,6 @@ * @member {number} */ this.currentBlendMode = 99999; - this.currentSourcePremultiplied = true; } BlendModeManager.prototype = Object.create(WebGLManager.prototype); @@ -27,27 +26,17 @@ * @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, isSourcePremultiplied) +BlendModeManager.prototype.setBlendMode = function (blendMode) { - if (typeof isSourcePremultiplied === 'undefined') { - isSourcePremultiplied = true; - } - if (this.currentBlendMode === blendMode && - this.currentSourcePremultiplied === isSourcePremultiplied) + if (this.currentBlendMode === blendMode) { return false; } this.currentBlendMode = blendMode; - this.currentSourcePremultiplied = isSourcePremultiplied; var mode = this.renderer.blendModes[this.currentBlendMode]; - 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]); - } + this.renderer.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 39c6612..f68d03a 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, currentBaseTexture.premultipliedAlpha ); + this.renderer.blendModeManager.setBlendMode( currentBlendMode ); } if (shaderSwap) diff --git a/src/core/particles/webgl/ParticleRenderer.js b/src/core/particles/webgl/ParticleRenderer.js index 0644835..30043ab 100644 --- a/src/core/particles/webgl/ParticleRenderer.js +++ b/src/core/particles/webgl/ParticleRenderer.js @@ -176,6 +176,7 @@ } // if the uvs have not updated then no point rendering just yet! + this.renderer.blendModeManager.setBlendMode(container.blendMode); var gl = this.renderer.gl; @@ -205,7 +206,6 @@ { 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 30034dc..fdd49f7 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -540,7 +540,7 @@ }; /** - * Maps Pixi blend modes to WebGL blend modes. + * Maps Pixi blend modes to WebGL blend modes. It works only for pre-multiplied textures. * * @private */ @@ -552,10 +552,10 @@ { this.blendModes = {}; - 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.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; + this.blendModes[CONST.BLEND_MODES.ADD] = [gl.ONE, 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_MINUS_SRC_COLOR]; + this.blendModes[CONST.BLEND_MODES.SCREEN] = [gl.ONE, gl.ONE_MINUS_SRC_COLOR]; this.blendModes[CONST.BLEND_MODES.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; this.blendModes[CONST.BLEND_MODES.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; diff --git a/src/core/renderers/webgl/managers/BlendModeManager.js b/src/core/renderers/webgl/managers/BlendModeManager.js index b6eb6e1..0112a9d 100644 --- a/src/core/renderers/webgl/managers/BlendModeManager.js +++ b/src/core/renderers/webgl/managers/BlendModeManager.js @@ -14,7 +14,6 @@ * @member {number} */ this.currentBlendMode = 99999; - this.currentSourcePremultiplied = true; } BlendModeManager.prototype = Object.create(WebGLManager.prototype); @@ -27,27 +26,17 @@ * @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, isSourcePremultiplied) +BlendModeManager.prototype.setBlendMode = function (blendMode) { - if (typeof isSourcePremultiplied === 'undefined') { - isSourcePremultiplied = true; - } - if (this.currentBlendMode === blendMode && - this.currentSourcePremultiplied === isSourcePremultiplied) + if (this.currentBlendMode === blendMode) { return false; } this.currentBlendMode = blendMode; - this.currentSourcePremultiplied = isSourcePremultiplied; var mode = this.renderer.blendModes[this.currentBlendMode]; - 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]); - } + this.renderer.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 39c6612..f68d03a 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, currentBaseTexture.premultipliedAlpha ); + this.renderer.blendModeManager.setBlendMode( currentBlendMode ); } if (shaderSwap) diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 78e5151..deb36d2 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -100,6 +100,7 @@ /** * Controls if RGB channels should be pre-multiplied by Alpha (WebGL only) + * All blend modes, and shaders written for default value. Change it on your own risk. * * @member {boolean} * @default true