Autor Wątek: Pozycja pomiędzy vertexami w GLSL  (Przeczytany 2276 razy)

Offline Vipa

  • Redaktor

# Listopad 01, 2012, 09:30:30
Ok, ta metoda ze sphere map, powiedzmy że się sprawdza, choć gdy kula jest w rogu ekranu to już widzę przekłamania.

Ale jeszcze mnie zaciekawił temat deferred lightingu, mam mapę normalnych sceny, mam depth mapę, mam albedo. Mam pozycje świateł, rysuję sfery i na końcu nakładam blendingiem. Efekt jest taki jak powinien, wszystko działa jak ma. Doszedłem do momentu, w którym wyliczyć trzeba attenuation. No i tu mam od pozycji światła odjąć pozycję pixela i podzielić przez rozmiar światełka:
attenuation = clamp(1.0 - length(light_position - position) / light_size, 0.0, 1.0);I diabeł jeden, zgubiłem się.
- light_position z tego co widzę jest przekazywany przez uniform vec3, więc to pozycja w 3D.
- light_size mam oczywiście

No i problem ten sam co na początku tematu: skąd bierze się position? Widzę masę różnych metod, ale niczego konkretnie opisanego, ma ktoś doświadczenie w tym?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kuba D.

  • Użytkownik

# Listopad 01, 2012, 14:11:58
To zależy jak przechowujesz pozycję piksela sceny - są dwa sposoby - w teksturze floatowej przechowujesz położenie x,y,z (wypełniasz tę teksturę zamiast depthmapy) i normalnie czytasz te wartości z tekstury podczas liczenia oświetlenia - najprostszy sposób ale i nie najlepszy.
Drugi sposób - rekonstruujesz pozycję piksela z depthmapy. Sporo tego na necie - nawet na warsztacie art jest na ten temat http://warsztat.gd/files/articles/igk/2008/Deferred%20Shading.pdf
patrz rozdział 5.1.1

Offline Vipa

  • Redaktor

# Listopad 01, 2012, 16:43:10
Hmmm, to kolejna metoda, którą widzę :). Ale spoko. Powinno to w skrócie wyglądać tak?

vec3 eyeVec = vec3(gl_FragCoord.x * (screen_size.x / screen_size.y), gl_FragCoord.y, 1.0 / tan(75.0 / 2.0));
vec3 pixelpos = normalize(eyeVec) * gl_FragCoord.z;

I wynikowo powinienem dostać pozycję pixela w przedziałach -1;1 w XYZ ?
Gubię się co ma być w w przedziale -1;1 a co we wsp. ekranu.