shaderlib: Add alpha_blend function, extend place_texture example, update autocomplete - implements #23

This commit is contained in:
ChaoticByte 2024-12-30 17:02:19 +01:00
parent 3abaf38400
commit 1635cd5b82
No known key found for this signature in database
3 changed files with 21 additions and 8 deletions

View file

@ -1,6 +1,7 @@
shader_type canvas_item; shader_type canvas_item;
#include "res://shaderlib/transform.gdshaderinc" #include "res://shaderlib/transform.gdshaderinc"
#include "res://shaderlib/transparency.gdshaderinc"
//!load ./swamp.jpg //!load ./swamp.jpg
//!load+ img2 ./grass.png //!load+ img2 ./grass.png
@ -9,6 +10,6 @@ uniform sampler2D img2: repeat_disable, filter_nearest;
void fragment() { void fragment() {
vec4 grass = place_texture(img2, UV, TEXTURE_PIXEL_SIZE, vec2(0, .47), vec2(1)); 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 grass.rgb += (vec3(0.02, 0.07, 0.1) - ((UV.y - .8) * 0.15)); // color correction
COLOR.rgb = mix(COLOR.rgb, grass.rgb, grass.a); COLOR = alpha_blend(COLOR, grass);
} }

View file

@ -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);
}

View file

@ -124,11 +124,13 @@ const gdshader_builtins = [
# shaderlib # shaderlib
var shaderlib_regex = { var shaderlib_regex = {
"hsv": RegEx.create_from_string(r'\s*\#include\s+\"res\:\/\/shaderlib\/hsv\.gdshaderinc\"'), "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 = { const shaderlib_functions = {
"hsv": ["rgb2hsv", "hsv2rgb", "hsv_offset", "hsv_multiply"], "hsv": ["rgb2hsv", "hsv2rgb", "hsv_offset", "hsv_multiply"],
"transform": ["place_texture"] "transform": ["place_texture"],
"transparency": ["alpha_blend"],
} }
# #
# configure Highlighter # configure Highlighter
@ -182,8 +184,9 @@ func _on_code_edit_code_completion_requested():
code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED) code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED)
# shaderlib # # shaderlib #
var shader_code = code_editor.text var shader_code = code_editor.text
for key in shaderlib_functions: for key in shaderlib_regex:
if shaderlib_regex[key].search(shader_code) != null: if shaderlib_regex[key].search(shader_code) != null:
if key in shaderlib_functions:
for k in shaderlib_functions[key]: for k in shaderlib_functions[key]:
code_editor.code_completion_prefixes.append(k) code_editor.code_completion_prefixes.append(k)
code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED) code_editor.add_code_completion_option(CodeEdit.KIND_FUNCTION, k, k+"(", Color.INDIAN_RED)