So I solved this now by first - in GDscript - calculate the ratio and offset values of the sprite to draw vs. the whole tile set texture. Then I instance create the shader material
var ratio = sprite.texture.get_size() / sprite.region_rect.size
var offset = sprite.region_rect.position / sprite.texture.get_size() * ratio
var material = ShaderMaterial.new()
material.shader = construction_shader # loaded previously via preload()
material.set_shader_param("ratio", ratio)
material.set_shader_param("offset", offset)
sprite.material = material
Then in the fragment shader itself I do the following to calculate the UV coordinates mapped to the current tile:
uniform vec2 ratio = vec2(0.0);
uniform vec2 offset = vec2(0.0);
void fragment() {
vec2 uv = UV * ratio - offset;
// do whatever you want with the mapped UVs ...
}
Hope that helps!