84 lines
2.1 KiB
Plaintext
84 lines
2.1 KiB
Plaintext
#version 330 core
|
|
|
|
// Interpolated values from the vertex shaders
|
|
in vec2 UV;
|
|
|
|
// Ouput data
|
|
layout(location = 0) out vec3 color;
|
|
//out vec3 color;
|
|
|
|
// Values that stay constant for the whole mesh.
|
|
uniform sampler2D myTextureSampler;
|
|
|
|
// Relative width/height of a pixel
|
|
uniform float pixWidth;
|
|
uniform float pixHeight;
|
|
|
|
|
|
// Pixel state
|
|
int IS_BACKGROUND = 0;
|
|
int IS_UNDEFINED = 1;
|
|
int IS_FOREGROUND = 2;
|
|
int UNSET = -1;
|
|
|
|
vec3 greenValue = vec3(0.0f, 1.0f, 0.0f);
|
|
vec3 difference = vec3(40.0f/255.0f);
|
|
int radius = 10;
|
|
|
|
|
|
vec3 getColor(vec2 uvCoord) {
|
|
return texture(myTextureSampler, uvCoord).rgb;
|
|
}
|
|
|
|
bool isBackground(vec3 c) {
|
|
/*// 49,206, 11
|
|
if (all( lessThanEqual(c, vec3(51.0f/255.0f, 208.0f/255.0f, 13.0f/255.0f))) &&
|
|
all(greaterThanEqual(c, vec3(47.0f/255.0f, 204.0f/255.0f, 9.0f/255.0f)))*/
|
|
// 0, 255, 0
|
|
if (all( lessThanEqual(c, greenValue+difference)) &&
|
|
all(greaterThanEqual(c, greenValue-difference))
|
|
) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void main(){
|
|
int status = UNSET;
|
|
|
|
for(int w=-radius;w<=radius;w++){
|
|
for(int h=-radius;h<=radius;h++){
|
|
if (w+h==-radius*2) { // first pixel
|
|
if (isBackground(getColor(UV+vec2(pixWidth*w, pixHeight*h)))) {
|
|
status = IS_BACKGROUND;
|
|
} else {
|
|
status = IS_FOREGROUND;
|
|
}
|
|
} else { // other pixels
|
|
if (isBackground(getColor(UV+vec2(pixWidth*w, pixHeight*h)))) {
|
|
if (status != IS_BACKGROUND) {
|
|
status = IS_UNDEFINED;
|
|
w=100000;
|
|
break;
|
|
}
|
|
} else {
|
|
if (status != IS_FOREGROUND) {
|
|
status = IS_UNDEFINED;
|
|
w=100000;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (status == IS_BACKGROUND) {
|
|
color = vec3(0.0f);
|
|
} else if (status == IS_FOREGROUND) {
|
|
color = vec3(1.0f);
|
|
} else {
|
|
color = vec3(0.5f);
|
|
}
|
|
}
|