diff --git a/examples/place_texture.gdshader b/examples/place_texture.gdshader index 95a26f0..282ee69 100644 --- a/examples/place_texture.gdshader +++ b/examples/place_texture.gdshader @@ -1,6 +1,7 @@ shader_type canvas_item; #include "res://shaderlib/transform.gdshaderinc" +#include "res://shaderlib/transparency.gdshaderinc" //!load ./swamp.jpg //!load+ img2 ./grass.png @@ -9,6 +10,6 @@ uniform sampler2D img2: repeat_disable, filter_nearest; void fragment() { vec4 grass = place_texture(img2, UV, TEXTURE_PIXEL_SIZE, vec2(0, .47), vec2(1)); - grass.rgb += (vec3(0.03, 0.07, 0.11) - ((UV.y - .8) * 0.15)); // color correction - COLOR.rgb = mix(COLOR.rgb, grass.rgb, grass.a); + grass.rgb += (vec3(0.02, 0.07, 0.1) - ((UV.y - .8) * 0.15)); // color correction + COLOR = alpha_blend(COLOR, grass); } diff --git a/shaderlib/transparency.gdshaderinc b/shaderlib/transparency.gdshaderinc new file mode 100644 index 0000000..d03949d --- /dev/null +++ b/shaderlib/transparency.gdshaderinc @@ -0,0 +1,9 @@ + +// Alpha Blending a over b after Bruce A. Wallace +// sources: +// - https://en.wikipedia.org/wiki/Alpha_compositing +vec4 alpha_blend(vec4 b, vec4 a) { + float alpha = a.a + (b.a * (1.0 - a.a)); + vec3 col = ((a.rgb*a.a) + ((b.rgb*b.a) * (1.0 - a.a)) / alpha); + return vec4(col.r, col.g, col.b, alpha); +} diff --git a/src/Editor.gd b/src/Editor.gd index d89cdbe..368dcde 100644 --- a/src/Editor.gd +++ b/src/Editor.gd @@ -124,11 +124,13 @@ const gdshader_builtins = [ # shaderlib var shaderlib_regex = { "hsv": RegEx.create_from_string(r'\s*\#include\s+\"res\:\/\/shaderlib\/hsv\.gdshaderinc\"'), - "transform": RegEx.create_from_string(r'\s*\#include\s+\"res\:\/\/shaderlib\/transform\.gdshaderinc\"') + "transform": RegEx.create_from_string(r'\s*\#include\s+\"res\:\/\/shaderlib\/transform\.gdshaderinc\"'), + "transparency": RegEx.create_from_string(r'\s*\#include\s+\"res\:\/\/shaderlib\/transparency\.gdshaderinc\"') } const shaderlib_functions = { "hsv": ["rgb2hsv", "hsv2rgb", "hsv_offset", "hsv_multiply"], - "transform": ["place_texture"] + "transform": ["place_texture"], + "transparency": ["alpha_blend"], } # # configure Highlighter @@ -182,11 +184,12 @@ func _on_code_edit_code_completion_requested(): code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED) # shaderlib # var shader_code = code_editor.text - for key in shaderlib_functions: + for key in shaderlib_regex: if shaderlib_regex[key].search(shader_code) != null: - for k in shaderlib_functions[key]: - code_editor.code_completion_prefixes.append(k) - code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED) + if key in shaderlib_functions: + for k in shaderlib_functions[key]: + code_editor.code_completion_prefixes.append(k) + code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED) # # # # # # # code_editor.update_code_completion_options(true) #