I wrote a shader to apply patterns to objects, for colorblind users.
The pattern is passed in as a shader parameter, currently with a linear filter:
uniform sampler2D pattern : filter_linear;
The same shader is applied to pixelated and smooth objects, so I need a way to set the TextureFilter property on a case-by-case basis. (Pixelated objects need filter_nearest
and smooth objects need filter_linear
.) But Godot shader language doesn't seem to allow setting the filter type via shader parameter, nor does it allow the filter_default
keyword mentioned here which inherits the filter from the Node it's applied to.
The only recourse I can think of is to make two different shaders, or use two texture input parameters - neither seem to be the best solution. How can I configure one shader to elegantly handle both filter types?
shader_type canvas_item;
uniform vec3 color1 = vec3(1.0, 1.0, 1.0);
uniform vec3 color2 = vec3(1.0, 1.0, 1.0);
uniform sampler2D pattern : filter_linear;
uniform float patternScale = 3.;
void fragment()
{
float textureW = float(textureSize(TEXTURE, 0).x);
float textureH = float(textureSize(TEXTURE, 0).y);
float patternW = float(textureSize(pattern, 0).x);
float patternH = float(textureSize(pattern, 0).y);
vec2 patternCoordinates = vec2(mod(UV.x * textureW / patternW / patternScale, 1.), mod(UV.y * textureH / patternH / patternScale, 1.));
float patternValue = 1. - texture(pattern, patternCoordinates).r;
vec4 color = COLOR;
vec3 patternColor = (color.a > .7 ? (color1 * (1. - patternValue) + color2 * patternValue) : color1);
color.r *= patternColor.r;
color.g *= patternColor.g;
color.b *= patternColor.b;
COLOR = color;
}