diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index e4a6152..6746f50 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -241,6 +241,13 @@ this.boundTextures = new Array(maxTextures); this.emptyTextures = new Array(maxTextures); + /** + * Did someone temper with textures state? We'll overwrite them when we need to unbind something. + * @member {boolean} + * @private + */ + this._unknownBoundTextures = false; + // create a texture manager... this.textureManager = new TextureManager(this); this.filterManager = new FilterManager(this); @@ -600,6 +607,22 @@ texture = texture.baseTexture || texture; + if (this._unknownBoundTextures) + { + this._unknownBoundTextures = false; + // someone changed webGL state, + // we have to be sure that our texture does not appear in multitexture renderer samplers + + for (let i = 0; i < this.boundTextures.length; i++) + { + if (this.boundTextures[i] === this.emptyTextures[i]) + { + gl.activeTexture(gl.TEXTURE0 + i); + gl.bindTexture(gl.TEXTURE_2D, this.emptyTextures[i]._glTextures[this.CONTEXT_UID].texture); + } + } + } + for (let i = 0; i < this.boundTextures.length; i++) { if (this.boundTextures[i] === texture) @@ -665,6 +688,8 @@ this._activeShader = null; this._activeRenderTarget = this.rootRenderTarget; + this._unknownBoundTextures = true; + for (let i = 0; i < this.boundTextures.length; i++) { this.boundTextures[i] = this.emptyTextures[i];