#version 330 core
 
layout(location=0) out vec4 vFragColor;	//wyjście shadera fragmentów

//dane z shadera wierzchołków
smooth in vec2 vUV;						//współrzędne tekstury 2D

//uniform shadera
uniform sampler2D textureMap;			//obraz filtrowany


//jądro wyostrzające 3x3  
const float kernel[]=float[9] (-1,-1,-1,
							   -1,8,-1,
							   -1,-1,-1);
 

//jądro wygładzające 3x3 
/*
const float kernel[]=float[9] (1,1,1,
								1,1,1,
								1,1,1);
*/
 
//jądro rozmycia gaussowskiego 3x3  
/*
const float kernel[]=float[9] (0,1,0,
								1,5,1,
								0,1,0);
*/ 

 
//jądra wytłaczające 
/*
const float kernel[]=float[9] (-4,-4, 0,		//wytłaczanie w kierunku NW 
								 -4, 12, 0,
								  0, 0, 0);
 
*/
/*
const float kernel[]=float[9] ( 0,-4,-4,		//wytłaczanie w kierunku NE 
								  0,12,-4,
								  0, 0, 0);
*/
/*
const float kernel[]=float[9] (0, 0, 0,			//wytłaczanie w kierunku SE 
								 0, 12,-4,
								 0,-4,-4);
*/
/*
const float kernel[]=float[9] (  0, 0, 0,		//wytłaczanie w kierunku SW 
								  -4, 12, 0,
								  -4,-4, 0);
*/

void main()
{ 
	//wyznaczanie odwrotności rozmiaru tekstury
	vec2 delta = 1.0/textureSize(textureMap,0);
	vec4 color = vec4(0);
	int  index = 8;

	//żeby wykonać splot, pobieramy próbki obrazu z otoczenia bieżącego piksela
	//i sumujemy iloczyny współczynników jądra splotu z odpowiadającymi im próbkami obrazu. 
	//Otrzymaną sumę dzielimy przez liczbę pikseli w analizowanym sąsiedztwie
	// i wynik dodajemy do koloru bieżącego fragmentu. W przypadku operacji wygładzania
	//dodawanie to jest pomijane, a uzyskany wynik splotu jest bezposrednio wstawiany zamiast 
	//koloru bieżącego fragmentu.

	//dla jąder wyostrzających i wytłaczających	 
	for(int j=-1;j<=1;j++) {
		for(int i=-1;i<=1;i++) {				
			color += kernel[index--]*texture(textureMap, vUV+ (vec2(i,j)*delta));
		}
	}
	color/=9.0;
	vFragColor =  color + texture(textureMap, vUV); 
	
	 
	/*
	//dla jąder wygładzających	
	for(int j=-1;j<=1;j++) {
		for(int i=-1;i<=1;i++) {				
			color += kernel[index--]*texture(textureMap, vUV+ (vec2(i,j)*delta));
		}
	}
	color/=9.0;
    vFragColor =  color;
	*/ 
}