WebGL:将spritebatch渲染为渲染纹理时的奇怪行为
Tech:WebGL / GL
10K
10K
1K
200与黑背景
混合配置:
gl.enable(gl.BLEND);
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
这是我如何创建渲染缓冲区:
this._texture = this.gl.createTexture();
this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture);
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.width, this.height, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
this.renderBuffer = this.gl.createFramebuffer();
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.renderBuffer);
this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, this._texture, 0);
我已将混合模式更改为:
gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
这是结果:
说明:
当你立即渲染到后台缓冲区时,alpha canal总是被设置为1.0(除了使用透明画布的情况外) - 因此,alpha的计算方式并不重要。
当你首先渲染渲染缓冲区(纹理),然后这个准备好的纹理被用来渲染到后台缓冲区 - 你需要为alpha和rgb使用不同的混合模式。
根据SRC和DESC alpha,SRC_ALPHA和ONE_MINUS_SRC_ALPHA用于RGB混合(乘法)。
如果阿尔法运河也将倍增,它将覆盖在纹理具有透明像素的地方的不透明像素。 我们需要将每个像素的alpha相加而不是相乘。
所以alpha函数需要设置为:ONE和ONE_MINUS_SRC_ALPHA,所以ALPHA将被累计,而不是相乘。
Luk:我不会说流利的英语(对不起)。 如果有人愿意“翻译”这个解释,我将不胜感激。
链接地址: http://www.djcxy.com/p/28021.html上一篇: WebGL: Strange behavior when render spritebatch into render texture