#version 330 core in vec4 polozenie; in vec4 kolor; in vec2 wspTekstur; in vec3 polozenie_scena; in vec3 normalna_scena; in vec2 polozenie_kamera; //parametry zrodla swiatla uniform vec4 Ca = vec4(1,1,1,1); uniform vec4 Cd = vec4(1,1,1,1); uniform vec4 Cs = vec4(1,1,1,1); uniform vec3 PolozenieZrodlaSwiatla = vec3(5,2,1); uniform vec3 PolozenieKamery = vec3(0,0,1); //parametry materialu const float wa = 0.1; const float wd = 1.0; //const float ws = 0.3; uniform vec4 Wa = vec4(wa,wa,wa,1); uniform vec4 Wd = vec4(wd,wd,wd,1); uniform vec4 Ws = vec4(0,1,0,1); uniform float WNs = 100.0; uniform bool OslabienieOswietlenia = false; uniform vec3 WspolczynnikiOslabieniaOswietlenia = vec3(1,0,0); float Oslabienie(float odleglosc) { if(!OslabienieOswietlenia) return 1; else return 1.0/(WspolczynnikiOslabieniaOswietlenia[0]+ WspolczynnikiOslabieniaOswietlenia[1]*odleglosc+ WspolczynnikiOslabieniaOswietlenia[2]*odleglosc*odleglosc); } uniform bool Teksturowanie = true; uniform sampler2D ProbnikTekstury0; //kolor uniform sampler2D ProbnikTekstury1; //mapa rozblysku uniform sampler2D ProbnikTekstury2; //mapa normalnych //mozna zrobic uniform vec2 przesuniecie = vec2(1.0/800.0, -1.0/600.0); //to wyznacza kierunek cienia float wzmocnienie = 3; vec2 rozmiarOkna = vec2(800,600); vec2 rozmiarProstokata = vec2(10, 10); //w pikselach int zakres1 = 5; float zakres2 = 10.0; vec4 ObliczKolorPhong(vec3 polozenie,vec3 normalna,vec4 kolor) { vec3 R = polozenie; vec3 L = PolozenieZrodlaSwiatla-R; float odleglosc = length(L); float oslabienie = Oslabienie(odleglosc); L=normalize(L); vec3 N = normalize(normalna); float dotLN = dot(L,N); vec3 O = 2.0*dotLN*N-L; //vec3 O = reflect(-L,N); vec3 V = normalize(PolozenieKamery-R); float dotOVn = pow(max(dot(O,V),0.0),WNs); dotLN = max(dotLN,0.0); vec4 teksel0 = vec4(1.0f, 1.0f, 1.0f, 1.0f); vec4 teksel1 = vec4(1.0f, 1.0f, 1.0f, 1.0f); vec4 teksel2 = vec4(1.0f, 1.0f, 1.0f, 1.0f); if(Teksturowanie) { //teksel0 = texture2D(ProbnikTekstury0, wspTekstur); teksel0 = vec4(0); float sumaWag = 0; for(int ix = -zakres1; ix <= zakres1; ix++) { for(int iy = -zakres1; iy <= zakres1; iy++) { //if(ix == 0 && iy == 0) continue; float dx = ix / rozmiarOkna.x; float dy = iy / rozmiarOkna.y; float r2 = dx*dx + dy*dy; float waga = exp(-r2/(2*zakres2*zakres2)); //zamiast obliczac, lepiej stabularyzowac teksel0 += texture(ProbnikTekstury0, wspTekstur + vec2(dx,dy)) * waga; sumaWag += waga; } } teksel0.rgb /= sumaWag; teksel0.a = 1; //teksel0 = texture(ProbnikTekstury0, wspTekstur); //teksel0.a = 1; teksel1 = texture(ProbnikTekstury1, wspTekstur); teksel1.a = 1; teksel2 = texture(ProbnikTekstury2, wspTekstur); teksel2.a = 1; } vec4 _kolor = Wa*Ca*kolor*teksel0; _kolor+= oslabienie*Wd*Cd*kolor*teksel0*dotLN; _kolor+= oslabienie*Ws*Cs*teksel1*dotOVn; return _kolor; } uniform bool CelShading = false; float DyskretyzujWartosc(float wartosc) { if(wartosc>=0 && wartosc <=0.25) return 0.1; if(wartosc>0.25 && wartosc <=0.5) return 0.4; if(wartosc>0.5 && wartosc <=0.75) return 0.7; return 1; } vec4 DyskretyzujKolor(vec4 kolor) //cel-shading { kolor.r = DyskretyzujWartosc(kolor.r); kolor.g = DyskretyzujWartosc(kolor.g); kolor.b = DyskretyzujWartosc(kolor.b); return kolor; } out vec4 kolor_out; void main(void) { kolor_out = ObliczKolorPhong(polozenie_scena,normalna_scena,kolor); if(CelShading) kolor_out = DyskretyzujKolor(kolor_out); }