From 797aab3443bafc95486bacf8623153c0222655d2 Mon Sep 17 00:00:00 2001 From: zoe Date: Mon, 9 May 2022 16:17:40 +0200 Subject: [PATCH] steal shader hehe (i still need to see if this actually works) --- godot/world/Tilemap.tscn | 69 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/godot/world/Tilemap.tscn b/godot/world/Tilemap.tscn index d835d56..7c73056 100644 --- a/godot/world/Tilemap.tscn +++ b/godot/world/Tilemap.tscn @@ -1,10 +1,77 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://world/terrain/terrain.tres" type="TileSet" id=1] [ext_resource path="res://world/Tilemap.gd" type="Script" id=2] +[sub_resource type="Shader" id=1] +code = "// My custom shader for implementing dithered alpha +shader_type spatial; +render_mode blend_mix,depth_draw_opaque,cull_disabled,diffuse_burley,specular_schlick_ggx; + +// Texture maps +uniform sampler2D texture_albedo : hint_albedo; +uniform sampler2D texture_masks : hint_white; +uniform sampler2D texture_normal : hint_normal; + +// Parameters +uniform vec4 albedo : hint_color; +uniform float specular = 0.5; +uniform float metallic = 0.0; +uniform float roughness : hint_range(0,1) = 0.5; +uniform float normal_strength : hint_range(0,2) = 1.0; + +void fragment() { + vec4 albedo_tex = texture(texture_albedo, UV); + vec4 masks_tex = texture(texture_masks, UV); + float alpha = albedo_tex.a; + + ALBEDO = albedo.rgb * albedo_tex.rgb; + METALLIC = metallic * masks_tex.r; + ROUGHNESS = roughness * masks_tex.g; + NORMALMAP = texture(texture_normal, UV).rgb; + NORMALMAP_DEPTH = normal_strength; + + // Fancy dithered alpha stuff + float opacity = albedo_tex.a; + int x = int(FRAGCOORD.x) % 4; + int y = int(FRAGCOORD.y) % 4; + int index = x + y * 4; + float limit = 0.0; + + if (x < 8) { + if (index == 0) limit = 0.0625; + if (index == 1) limit = 0.5625; + if (index == 2) limit = 0.1875; + if (index == 3) limit = 0.6875; + if (index == 4) limit = 0.8125; + if (index == 5) limit = 0.3125; + if (index == 6) limit = 0.9375; + if (index == 7) limit = 0.4375; + if (index == 8) limit = 0.25; + if (index == 9) limit = 0.75; + if (index == 10) limit = 0.125; + if (index == 11) limit = 0.625; + if (index == 12) limit = 1.0; + if (index == 13) limit = 0.5; + if (index == 14) limit = 0.875; + if (index == 15) limit = 0.375; + } + // Is this pixel below the opacity limit? Skip drawing it + if (opacity < limit) + discard; +}" + +[sub_resource type="ShaderMaterial" id=2] +shader = SubResource( 1 ) +shader_param/albedo = null +shader_param/specular = 0.5 +shader_param/metallic = 0.0 +shader_param/roughness = 0.5 +shader_param/normal_strength = 1.0 + [node name="Tilemap" type="TileMap"] process_priority = 124 +material = SubResource( 2 ) position = Vector2( -2, 0 ) mode = 1 tile_set = ExtResource( 1 )