135 lines
4.1 KiB
GLSL
135 lines
4.1 KiB
GLSL
#version 330 core
|
|
out vec4 FragColor;
|
|
|
|
in vec2 TexCoords;
|
|
|
|
uniform sampler2D screenTexture;
|
|
|
|
const float offset = 1.0 / 2000.0;
|
|
|
|
int posToIndex(int x, int y);
|
|
float calculateAveragedEdge(int x, int y, vec3 sT[25]);
|
|
|
|
void main(){
|
|
vec2 offsets[25] = vec2[25](
|
|
vec2(-2 * offset, 2 * offset),
|
|
vec2(-2 * offset, 1 * offset),
|
|
vec2(-2 * offset, 0 * offset),
|
|
vec2(-2 * offset, -1 * offset),
|
|
vec2(-2 * offset, -2 * offset),
|
|
vec2(-1 * offset, 2 * offset),
|
|
vec2(-1 * offset, 1 * offset),
|
|
vec2(-1 * offset, 0 * offset),
|
|
vec2(-1 * offset, -1 * offset),
|
|
vec2(-1 * offset, -2 * offset),
|
|
vec2( 0 * offset, 2 * offset),
|
|
vec2( 0 * offset, 1 * offset),
|
|
vec2( 0 * offset, 0 * offset),
|
|
vec2( 0 * offset, -1 * offset),
|
|
vec2( 0 * offset, -2 * offset),
|
|
vec2( 1 * offset, 2 * offset),
|
|
vec2( 1 * offset, 1 * offset),
|
|
vec2( 1 * offset, 0 * offset),
|
|
vec2( 1 * offset, -1 * offset),
|
|
vec2( 1 * offset, -2 * offset),
|
|
vec2( 2 * offset, 2 * offset),
|
|
vec2( 2 * offset, 1 * offset),
|
|
vec2( 2 * offset, 0 * offset),
|
|
vec2( 2 * offset, -1 * offset),
|
|
vec2( 2 * offset, -2 * offset)
|
|
);
|
|
// vec2 offsets[9] = vec2[](
|
|
// vec2(-offset, offset), // top-left
|
|
// vec2( 0.0f, offset), // top-center
|
|
// vec2( offset, offset), // top-right
|
|
// vec2(-offset, 0.0f), // center-left
|
|
// vec2( 0.0f, 0.0f), // center-center
|
|
// vec2( offset, 0.0f), // center-right
|
|
// vec2(-offset, -offset), // bottom-left
|
|
// vec2( 0.0f, -offset), // bottom-center
|
|
// vec2( offset, -offset) // bottom-right
|
|
// );
|
|
|
|
// float kernel[9] = float[](
|
|
// -1, -1, -1,
|
|
// -1, 9, -1,
|
|
// -1, -1, -1
|
|
// );
|
|
|
|
vec3 sT[25];
|
|
for(int x = 0; x < 5; x++){
|
|
for(int y = 0; y < 5; y++){
|
|
sT[x * 5 + y] = texture(screenTexture, TexCoords.st + offsets[x * 5 + y]).xyz;
|
|
}
|
|
}
|
|
// vec3 Gx = (-sT[0] + sT[2]) + 2 * (-sT[3] + sT[5]) + (-sT[6] + sT[8]);
|
|
// vec3 Gy = (sT[0] + 2 * sT[1] + sT[2]) - (sT[6] + 2 * sT[7] + sT[8]);
|
|
// vec3 G = sqrt(Gx * Gx + Gy * Gy);
|
|
// float averaged = (G.x + G.y + G.z)/3.0;
|
|
float vals[9];
|
|
for(int x = 0; x < 3; x++){
|
|
for(int y = 0; y < 3; y++){
|
|
vals[x * 3 + y] = calculateAveragedEdge(x,y,sT);
|
|
}
|
|
}
|
|
|
|
float rVal = 0;
|
|
float cutoff1 = 0.6;
|
|
float cutoff2 = 0.1;
|
|
float cutoff3 = 0.5;
|
|
|
|
float surroundAvg = (vals[0] + vals[2] + vals[6] + vals[8])/4.0;
|
|
|
|
if(
|
|
//center
|
|
vals[4] > cutoff1 &&
|
|
surroundAvg > cutoff3
|
|
// //plus
|
|
// vals[1] > cutoff2 &&
|
|
// vals[3] > cutoff2 &&
|
|
// vals[5] > cutoff2 &&
|
|
// vals[7] > cutoff2 //&&
|
|
// // //diag
|
|
// vals[0] < cutoff3 &&
|
|
// vals[2] < cutoff3 &&
|
|
// vals[6] < cutoff3 &&
|
|
// vals[8] < cutoff3
|
|
){
|
|
rVal = min(vals[4],1.0);
|
|
}
|
|
|
|
// rVal = calculateAveragedEdge(1,1,sT);
|
|
// if(rVal < 0.8){
|
|
// rVal = 0;
|
|
// }
|
|
// vec3 col = vec3(0.0);
|
|
// for(int i = 0; i < 9; i++){
|
|
// col += sampleTex[i] * kernel[i];
|
|
// }
|
|
|
|
|
|
FragColor = vec4(rVal,rVal,rVal,1);
|
|
}
|
|
|
|
float calculateAveragedEdge(int x, int y, vec3 sT[25]){
|
|
//compute sobel kernel
|
|
vec3 Gx =
|
|
(-sT[posToIndex(x,y) + 0] + sT[posToIndex(x,y) + 2]) +
|
|
2 * (-sT[posToIndex(x,y) + 5] + sT[posToIndex(x,y) + 7]) +
|
|
(-sT[posToIndex(x,y) + 10] + sT[posToIndex(x,y)+ 12]);
|
|
vec3 Gy =
|
|
(sT[posToIndex(x,y) + 0] + 2 * sT[posToIndex(x,y) + 1] + sT[posToIndex(x,y) + 2]) -
|
|
(sT[posToIndex(x,y) + 10] + 2 * sT[posToIndex(x,y)+ 11] + sT[posToIndex(x,y) + 12]);
|
|
vec3 G = sqrt(Gx * Gx + Gy * Gy);
|
|
|
|
//compute laplacian kernel
|
|
vec3 L = sT[posToIndex(x,y) + 1] + sT[posToIndex(x,y) + 5] - 4 * sT[posToIndex(x,y) + 6] + sT[posToIndex(x,y) + 7] + sT[posToIndex(x,y) + 11];
|
|
|
|
float averaged = abs(G.x + G.y + G.z)/3.0;
|
|
return averaged;
|
|
}
|
|
|
|
int posToIndex(int x, int y){
|
|
return x * 5 + y;
|
|
}
|