Created
December 30, 2022 00:28
-
-
Save EliteMasterEric/f125ea0dea647d37320a114c9c0c7be2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package; | |
| import flixel.system.FlxAssets.FlxShader; | |
| import openfl.display.BitmapData; | |
| /** | |
| * Implements the overlay blend mode as a Flixel shader. | |
| * | |
| * @see https://en.wikipedia.org/wiki/Blend_modes#Overlay | |
| * @author EliteMasterEric | |
| */ | |
| class OverlayShader extends FlxShader | |
| { | |
| @:glFragmentSource(' | |
| #pragma header | |
| // Takes an image as the input. | |
| uniform sampler2D bitmapOverlay; | |
| vec4 blendOverlay(vec4 base, vec4 blend) | |
| { | |
| // Depending on the base color, compute a linear interpolation | |
| // between black (base layer = 0), the top layer (base layer = 0.5), and white (base layer = 1.0) | |
| return mix(1.0 - 2.0 * (1.0 - base) * (1.0 - blend), 2.0 * base * blend, step(base, vec4(0.5))); | |
| } | |
| void main() | |
| { | |
| // Get the current pixel from the base layer. | |
| vec4 base = texture2D(bitmap, openfl_TextureCoordv); | |
| // Get the current pixel from the overlay layer. | |
| vec4 blend = texture2D(bitmapOverlay, openfl_TextureCoordv); | |
| // Compute the overlay blend mode. | |
| gl_FragColor = blendOverlay(base, blend); | |
| }') | |
| public function new() | |
| { | |
| super(); | |
| } | |
| /** | |
| * Assigns the bitmap to be used as the overlay. | |
| * @param bitmap A BitmapData object containing the image to use as the overlay. | |
| */ | |
| public function setBitmapOverlay(bitmap:BitmapData):Void | |
| { | |
| this.bitmapOverlay.input = bitmap; | |
| } | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
OpenFL provides the ability to call
sprite.blend = BlendMode.OVERLAY;, however this does not do anything on most platforms. This code implements the functionality as a shader. This means it is not as compatible with multiple layered sprites, or with animated sprites, but it's still useful if you want to apply a single texture as an overlay to another sprite.This shader also serves as a good example for those looking to use multiple textures as an input for a shader.
This code is made available under the MIT License. It is based on this code, which is also available under the MIT License.