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;
 | |
| }
 |