67 lines
1.8 KiB
GLSL
67 lines
1.8 KiB
GLSL
/*
|
|
use #define OUTPUT_DISTANCE to output distance
|
|
use #define OUTPUT_DIRECTION to output direction
|
|
*/
|
|
|
|
uniform sampler2D tex0;
|
|
uniform sampler2D tex1;
|
|
uniform vec2 originalSize;
|
|
uniform vec2 directionalField;
|
|
uniform float distanceScale;
|
|
uniform bool normalizedDistance;
|
|
uniform bool unitDirection;
|
|
uniform bool flipV;
|
|
uniform bool outputIds;
|
|
uniform bool signedMagnitude;
|
|
in vec2 v_texCoord0;
|
|
|
|
out vec4 o_color;
|
|
|
|
void main() {
|
|
vec2 sizeDF = vec2(textureSize(tex0, 0)); // this is always square
|
|
vec2 sizeTF = vec2(textureSize(tex1, 0)); // this can be non-square
|
|
|
|
vec2 pixelPosition = v_texCoord0;
|
|
vec4 textureData = texture(tex0, v_texCoord0);
|
|
vec2 centroidPixelPosition = textureData.xy;
|
|
|
|
|
|
vec2 pixelDistance = (centroidPixelPosition - pixelPosition) * sizeDF;
|
|
|
|
if (flipV) {
|
|
pixelDistance *= vec2(1.0, -1.0);
|
|
}
|
|
|
|
float length_ = length(pixelDistance);
|
|
if (unitDirection) {
|
|
if (length_ >= 1E-6) {
|
|
pixelDistance /= length_;
|
|
}
|
|
}
|
|
|
|
vec2 dfTf = sizeDF / sizeTF; // texture adjusment factor
|
|
|
|
float outputData = (!outputIds) ? texture(tex1, v_texCoord0 * dfTf).r : textureData.b;
|
|
|
|
#ifdef OUTPUT_DIRECTION
|
|
if (!normalizedDistance) {
|
|
o_color = vec4(pixelDistance * distanceScale, outputData, 1.0);
|
|
} else if (!unitDirection) {
|
|
o_color = vec4(pixelDistance / originalSize, outputData, 1.0);
|
|
}
|
|
#else
|
|
if (!normalizedDistance) {
|
|
o_color = vec4(vec2(length(pixelDistance * distanceScale)), outputData, 1.0);
|
|
} else if (!unitDirection) {
|
|
o_color = vec4(vec2(length(pixelDistance / originalSize)), outputData, 1.0);
|
|
}
|
|
#endif
|
|
|
|
if (!outputIds) {
|
|
if (signedMagnitude) {
|
|
float s = -sign(o_color.b - 0.5);
|
|
o_color.rg *= s;
|
|
o_color.b = s * length_;
|
|
}
|
|
}
|
|
} |