Warsztat.GD

Produkcja gier => Grafika 3D => Wątek zaczęty przez: Vipa w Październik 31, 2012, 16:14:51

Tytuł: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 16:14:51
Naszło mnie na jakieś dziwactwa z grafiką i mam jeden problem.

Zielone tło to kula R=2.0 w przekroju, niebieski punkt to środek, czerwony to badany punkt. Interesuje mnie odległość od środka do punktu. Kula jest 3D (heh), każdy rysowany punkt jest w stałej odległości promienia R=2.0 od środka. I teraz interesuje mnie odległość od środka do punktu, w 2D tak jak widać, ale z zachowaniem skali promienia kuli. Czyli na przykładowym rysunku wychodziło by na oko 1.2.
Narysowana już kula może być większa lub mniejsza na ekranie (zachowując stały promień, bo np. jest raz bliżej a raz dalej), stąd badanie odległości w 2D chyba mija się z celem.

Ma ktoś jakiś pomysł?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Avaj w Październik 31, 2012, 16:17:02
"każdy rysowany punkt jest w stałej odległości promienia R=2.0 od środka. I teraz interesuje mnie odległość od środka do punktu" wat
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 16:20:00
Tak, ale w 2D. Wynikowo na ekranie. W 3D to oczywiście stała.
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Liosan w Październik 31, 2012, 16:30:11
Ale w jakim rzucie? Piszesz:
Narysowana już kula może być większa lub mniejsza na ekranie (zachowując stały promień, bo np. jest raz bliżej a raz dalej), stąd badanie odległości w 2D chyba mija się z celem.
czyli ... jak nie na ekranie to gdzie?

Liosan
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 16:39:31
No właśnie myślałem, że coś pomijam, że są jakieś przekształcenia.
Na chwilę obecną badam odległość w 2D i zastosowałem jakiś tam dobrany metodą prób i błędów mnożnik. Ale to mało profesjonalne raczej :).
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Pawelx156 w Październik 31, 2012, 16:39:47
Jeśli dobrze rozumiem:
Chodzi  o kulę w przestrzeni 3D o promieniu r =2 ( jakaś jednostka)
Stąd raz jest mniejsza, raz większa w zależności od pozycji kamery.
Direct chyba ma metodę od liczenia dystansu między wektorami 3d.
W Xna mam vector3.Distance(v1,v2).


A jak chcesz na sucho liczyć to można to tak: Podam tobie na 2d analogicznie 3d to samo:
punkty: a=(x1,y1), b=(x2,y2);

odleglosc = sqrt((x1-x2) * (x1-x2) + (y1-y2) *(y1-y2));
dla 3d oblicza się jeszcze Z czyli (z1-z2) * (z1 -z2);

Chyba że cię źle zrozumiałem
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: MrKaktus w Październik 31, 2012, 16:46:47
Vipa czy Ty masz na myśli że punkt czerwony w 3d jest na powierzchni sfery (w odleglosci stalej R od niebieskiego w 3d) a szukasz ich wzajemnej odleglosci na ekranie ?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 16:52:08
@MrKaktus: tak, ale z zachowaniem wielkości kuli. Jeżeli na ekranie punkt ten jest w około odległości 1.2 od środka, to o tą wartość 1.2 mi chodzi.
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: .c41x w Październik 31, 2012, 19:14:23
Ja bym najpierw sprawdził takie coś:
1. trzeba znaleźć punkt punkt który znajduje się na "brzegu" kuli (czyli jak mówisz punkt o wartości 2.0 - dokładnie równej promieniowi). Dokładniej mówiąc punkt na stycznej tej kuli, gdzie prosta stycznej przechodzi przez eye kamery.
2. masz 3 punkty: środek, ten który przed chwilą wyliczyłeś i punkt szukany - mnożysz każdy przez swoją macierz projekcji
3. wyliczasz proporcje biorąc za zmienną długość r kuli i wyliczone wcześniej punkty
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Kos w Październik 31, 2012, 19:26:53
Ale kula w rzucie perspektywicznym nie jest kołem, nie?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 19:40:32
No właśnie. Przy za dużej perspektywie wychodzą mi owale na brzegach.
Ale znalazłem jakiś sposób teoretycznie, renderzyć kulę w trybie sphere map, gdzie textura jest gradientem od 1 do 0. Czyli im bliżej środka tym bardziej biało. Wystarczy wtedy zbadać kolor pixela i przemnożyć przez 2x promień. Dokładność co do setnej części koloru jest mi zbędna, więc powinno dać radę.
Jak będę przy kompie jakimś co obsłuży shader to sprawdzę.
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 20:37:50
A jak to się robi w deferred lightingu? Tam też w sumie rysuje się jednolitą sferę do point lights a wynikowo otrzymuje się płynne przejście?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: albireo w Październik 31, 2012, 21:02:59
W deffered rysuje się też normalne, a one nie ją już tak jednolite.
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w Październik 31, 2012, 21:12:36
No tak, ale masz normale sceny, co one dają do natężenia światła w danym punkcie obrazu?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: .c41x w Październik 31, 2012, 23:46:37
Ale kula w rzucie perspektywicznym nie jest kołem, nie?
Jeśli styczna przejdzie przez jasno-niebieski punkt (rys.) to nie ma znaczenia.
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL / deferred lighting
Wiadomość wysłana przez: Vipa w 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?
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Kuba D. w 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
Tytuł: Odp: Pozycja pomiędzy vertexami w GLSL
Wiadomość wysłana przez: Vipa w 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.