From 90b8f15d8c20b6484d93a837da9a2999aa70b848 Mon Sep 17 00:00:00 2001 From: adroitwhiz Date: Tue, 4 Feb 2020 22:32:04 -0500 Subject: [PATCH 1/2] Un-premultiply extracted drawables --- src/RenderWebGL.js | 3 ++- src/ShaderManager.js | 5 +++++ src/shaders/sprite.frag | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/RenderWebGL.js b/src/RenderWebGL.js index 56c7c49..6f1c986 100644 --- a/src/RenderWebGL.js +++ b/src/RenderWebGL.js @@ -1124,7 +1124,8 @@ class RenderWebGL extends EventEmitter { gl.clear(gl.COLOR_BUFFER_BIT); try { gl.disable(gl.BLEND); - this._drawThese([drawableID], ShaderManager.DRAW_MODE.default, projection, + // ImageData objects store alpha un-premultiplied, so draw with the `straightAlpha` draw mode. + this._drawThese([drawableID], ShaderManager.DRAW_MODE.straightAlpha, projection, {effectMask: ~ShaderManager.EFFECT_INFO.ghost.mask}); } finally { gl.enable(gl.BLEND); diff --git a/src/ShaderManager.js b/src/ShaderManager.js index a71ef2d..4fb3da5 100644 --- a/src/ShaderManager.js +++ b/src/ShaderManager.js @@ -158,6 +158,11 @@ ShaderManager.DRAW_MODE = { */ default: 'default', + /** + * Un-premultiply alpha. Useful for reading pixels from GL into an ImageData object. + */ + straightAlpha: 'straightAlpha', + /** * Draw a silhouette using a solid color. */ diff --git a/src/shaders/sprite.frag b/src/shaders/sprite.frag index 13fe19d..b271fd2 100644 --- a/src/shaders/sprite.frag +++ b/src/shaders/sprite.frag @@ -210,6 +210,11 @@ void main() #endif // DRAW_MODE_colorMask #endif // DRAW_MODE_silhouette + #ifdef DRAW_MODE_straightAlpha + // Un-premultiply alpha. + gl_FragColor.rgb /= gl_FragColor.a + epsilon; + #endif + #else // DRAW_MODE_lineSample gl_FragColor = u_lineColor * clamp( // Scale the capScale a little to have an aliased region. From a427461467290afb61eb6e4e46d9ffa3ecb75b24 Mon Sep 17 00:00:00 2001 From: adroitwhiz Date: Thu, 26 Mar 2020 23:01:18 -0400 Subject: [PATCH 2/2] Clarify draw mode comments --- src/ShaderManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ShaderManager.js b/src/ShaderManager.js index 4fb3da5..3f0bc61 100644 --- a/src/ShaderManager.js +++ b/src/ShaderManager.js @@ -154,12 +154,12 @@ ShaderManager.EFFECTS = Object.keys(ShaderManager.EFFECT_INFO); */ ShaderManager.DRAW_MODE = { /** - * Draw normally. + * Draw normally. Its output will use premultiplied alpha. */ default: 'default', /** - * Un-premultiply alpha. Useful for reading pixels from GL into an ImageData object. + * Draw with non-premultiplied alpha. Useful for reading pixels from GL into an ImageData object. */ straightAlpha: 'straightAlpha',