[C#] Oświetlenie 2D 26116 74

O temacie

Autor Sauron

Zaczęty 27.01.2015 roku

Wyświetleń 26116

Odpowiedzi 74

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy

Sauron

[C#] Oświetlenie 2D
#40 2015-03-23, 20:18(Ostatnia zmiana: 2015-04-08, 21:09)
Mówiąc "samemu" miałem na myśli brak udziału innych programów, nie pomocy osób trzecich - ku woli ścisłości :P No, ale do rzeczy. Co z tą height mapą? Będzie potrzebna czy nie? Chwilowo załóżmy że będę to robił przez SSAO. Na wiki czytałem, że bierze się tam losowe punkty wokół rozpatrywanego i sprawdza się czy się widzą. Dużo tych punktów ma być? Jak daleko mogą być maksymalnie?

A i prawie zapomniałem :D Jak byś mógł. Jak zaimplementować radius spot lighta?
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Nie implementowałem SSAO. Najprostsza implementacja opiera się chyba na sprawdzanie okolicy punktu i porównywania bufora głębokości z buforem piksela na którym pracujemy. U ciebie za bufor głębokości będzie służyć height mapa.

Radius spot lighta? Tak jak w point lightcie chyba liczysz. i potem przemnażasz to co masz ze spot lighta z tego co ci wyszło z wygaszania od radius.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Problem w tym, że nie wiem jak to się liczy w point light'cie. Poza tym w spocie radius ma sens, w point tak trochę słabo. 

Mam jeszcze jedno pytanie, nie musisz tłumaczyć zbyt szczegółowo: załóżmy że chciałbym zrobić sobie cienie (planuje przerzucić się na GPU), jak? Co z reflection? Jak to liczyć? Dla każdego piksela z osobno? Czy współczynnik odbicia ma jakiś związek ze współczynnikiem specular'a? I ostatnie: jak na OpenGL'u robi się flat shading, skoro mam tylko  VertexShader i FragmentShader?
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
No radius w Point Lightcie to jest parametr pomocniczy głównie przeznaczony dla artystów, którzy potem będą te światełka ustawiali. Jak chcesz, możesz to olać i jechać w całości na attenutaion i tak samo robić w spot lighcie.

Z cieniami - w 2D może są jakieś dodatkowe triki. W 3D robi się to shadowmappingiem. Tego nie implementowałem już bo nie chciało mi się ogarniać framebufforów w OpenGLu. Ogólnie działa to tak, ze renderujesz scenę z punktu widzenia światła do bufora głębokości. Potem przy renderowaniu właściwym patrzysz na bufor głębokości obecny i porównujesz z odpowiednio przeskalowanym buforem głębokości ze światła. Jeśli ten ze światła jest wyraźnie mniejszy, to znaczy, że jest cień.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
OK, a reflection i flat shading?
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Co masz na myśli przez reflection?
Flat shading można - kwestia ustawienia normalek i splitowania ich na krawędziach.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Reflection - odbijanie światła otoczenia, np. lustro. A co do flat shading - mam normalne dla każdego wierzchołka, zmapowanego z teksturą (UV map). W OpenGL'u mam tylko VertexShader i FragmentShader. Nie mogę dodać czegoś do VertexShader z myślą, że zostanie to wykonane TYLKO raz na ścianie. Nie o to chodzi. To ma być wydajne, więc operacje na każdym Vertex'ie nie wchodzą w grę. Mógłbym sprawdzać, czy operacja na wierzchołku danej ściany była wykonana, i zastosować wynik do pozostałych wierzchołków, ale to wydaję mi się trudniejsze niż Gouraud, czy Phong i minimalnie bardziej wydajne. 
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Reflection - w 3D kurewsko ciężkie do zaimplementowania. Zarówno w offline jak i realtime. Wiem ogólnie jak to się robi, ale nie znam szczegółów implementacyjnych na tyle dobrze, żeby zrobić to samemu, a tym bardziej tłumaczyć to komuś. No chyba, że wystarczy ci odbicie z cubemapy danej teksturą - to da się jeszcze zrobić stosunkowo łatwo.

Żeby zrobić flat shading jeden wierzchołek musi być rozbijany na kilka dla każdej ściany której jest częścią musi być kopia. Jeśli chcesz używać flata tylko z powodów optymalizacyjnych, to nie ma sensu. Już w epoce PS1 takie podejście nie dłużej potrzebne. GPU to wydajne bydle i radzi sobie z shaderami killkukrotnie cięższymi niż Phong. Gouraud jest już historyczny w zasadzie, a flat używany jeśli koncepcja artystyczna tego wymaga.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
OK, dzięki. Chyba już ostatnie pytanie: bump i displacement map. Co to jest i jak to zaimplementować/jak to działa? Zależałoby mi na efekcie zniekształceń, takich jak w After Effects, czyli raczej dwuwymiarowe (nie wiem czy w 3D też to tam działa). Ciekawi mnie też tzw. fake bump mapping.
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Bump mapping to po prostu inna nazwa na normal mapping. Displacement to krok dalej w kierunku stworzenia iluzji wypukłości tam gdzie jej nie ma.


Na górze displacement. Na dole sam normal mapping. Geomteria to w obu przypadkach quad. Jest wiele sposobów implementacji lepszego/gorszego szybszego/wolniejszego łatwiejszego/trudniejszego displacementu. Ale tak czy siak to już musiałbyś robić na GPU na pewno.
 
Popisuje się ciągle menda jedna...

Sawik

Sawik

Użytkownicy
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Użytkownicy
  • Rebel
Czy tylko mi się wydaje że on myli forum z google? 
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Ciii Sawik - dzięki niemu czuję się potrzebny :F.

A na serio - pytania "jak to zrobić" są ok. Pytania "co to jest" zakładam że zadaje dopiero po niesatysfakcjonującym googlowaniu.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Wiem, że dużo oczekuje, ale chcę wyciągnąć z tematu najwięcej jak się da. Nie wykraczam poza regulamin - wszystko jest związane z "Oświetleniem 2D". Poza tym, ten temat może się przydać przyszłym pokoleniom "theModderatorów" - tyle wiedzy w jednym miejscu :P

Oczywiście czytałem o tym na wiki, ale tam wiedza jest przedstawiona w sposób zbyt ogólnikowy, nie ma powiedziane jak to zrobić tylko "upośledzone" co to jest. Dlatego pytam kogoś osobiście - tak zawsze jest lepiej.

Cytuj
Bump mapping to po prostu inna nazwa na normal mapping.
Z tego co ja czytałem to bump mapa opisuje, jakby przekształcenia normalnych. I teraz pytanie brzmi: Jak mają się kolory w odcieniach szarości do normalnych. Jak dobrze rozumiem mógłbym to potem "wypalić" na normal map'ie?

Hmm... displacement wygląda jakby unosił odpowiednie wierzchołki o odpowiednią wysokość. W After Effects zrobili to chyba po swojemu. Ale nieważne. Załóżmy że robię na GPU (mam taką możliwość), jak za to się zabrać, tak najłatwiej? A i dodam, że ciągle mówię o najprostszym chyba przypadku, kiedy to powierzchnia jest całkiem płaska, zwrócona do "widza" (normalna z monitora), to powinno ułatwić sprawę. Jeszcze tak z ciekawości da się displacement wypalić na normal mapę?
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Bump mapping można załatwić albo podając normal mapę, albo podając mapę wysokości i konwertować ją na mapę normalnych. Tylko, że to sprawia, że trzeba robić dużo więcej obliczeń. Po co skoro można podać już gotową normalkę zrobioną z pomocą programu który już to robi?

Co do displacementu. Jest coś takiego jak Vertex Displacement i to operuje na wierzchołkach i jest proste do napisania. Wymaga jednak mocnego zagęszczenia siatki tesalacją, żeby to wyglądało dobrze. Wiele algorytmów jednak tworzy iluzję w pixel shaderze nie deformując siatki. I tak jest w przypadku tego co było na załączonym przeze mnie obrazku. Da się to zrobić w 2D.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy

Sauron

[C#] Oświetlenie 2D
#54 2015-04-04, 19:29(Ostatnia zmiana: 2015-04-05, 13:26)
No ja mam normal mapę. Nie potrzebne mi przeliczać z height mapy. Po prostu nie wiem co zrobić z bump mapą.

Teselacja to nie problem w mojej sytuacji, bo wykonując operację piksel po pikselu liczę współrzędną. Przypominam - mam płaską, jedną powierzchnię.

EDIT: Ok, teraz zrozumiałem . Bump mapa to nic nowego, a tylko oszukańcze wykorzystanie normal lub height mapy. A więc: mam height mape. Jak policzyć z tego normalną? Co z tą oryginalną? Uśrednić? Dodać? Pomnożyć?
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
No ja mam normal mapę. Nie potrzebne mi przeliczać z height mapy. Po prostu nie wiem co zrobić z bump mapą.
Nic. Bump mapa to mapa wysokości z której można wygenerować normal mapę.

Teslacja to nie problem w mojej sytuacji, bo wykonując operację piksel po pikselu liczę współrzędną. Przypominam - mam płaską, jedną powierzchnię.
Tesalacja to zagęszczenie siatki. To co robisz na pikselach jest z tym niezwiązane.

EDIT: Ok, teraz zrozumiałem . Bump mapa to nic nowego, a tylko oszukańcze wykorzystanie normal lub height mapy. A więc: mam height mape. Jak policzyć z tego normalną? Co z tą oryginalną? Uśrednić? Dodać? Pomnożyć?
Jak masz już normal mapę to nie potrzebujesz jej wyliczać z heightmapy, bo już masz normal mapę.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Cytuj
Tesalacja to zagęszczenie siatki. To co robisz na pikselach jest z tym niezwiązane.
To co ja robię, można porównać do interpolacji na FragmentShader. Wiem, że chodzi ci o zagęszczanie siatki. Problem w tym że, ja takiej w ogóle nie mam. Ogólnie to ten sposób na CPU chyba nie pójdzie.

Cytuj
Jak masz już normal mapę to nie potrzebujesz jej wyliczać z heightmapy, bo już masz normal mapę.
Mam "oryginalną" normalną płaskiej powierzchni, tj. (0, 0, 1), dla każdego piksela. I teraz chcę, żeby komputer wyobraził sobie że mam jakąś specyficzną powierzchnie opisaną bump mapą, w formie height mapy, tak by po jej interpretacji, na powierzchni płaskiej powstałaby iluzja wybitego napisu. Teraz rozumiesz? Nie wiem jak height mapę "skonwertować" na normal mapę i co będzie z tą starą wartością (oryginalną).
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!

mgr Fartuess

[C#] Oświetlenie 2D
#57 2015-04-05, 19:07(Ostatnia zmiana: 2015-04-05, 21:37)
To co ja robię, można porównać do interpolacji na FragmentShader. Wiem, że chodzi ci o zagęszczanie siatki. Problem w tym że, ja takiej w ogóle nie mam. Ogólnie to ten sposób na CPU chyba nie pójdzie.
Vertex Displacement ci nie pójdzie bo nie masz wierzchołków. Displacement Mapping możesz zrobić, ale będzie się robił kilkadziesiąt razy dłużej niż z samym bump mappingiem zrobionym z podanych normal map zapewne.


Cytuj
Mam "oryginalną" normalną płaskiej powierzchni, tj. (0, 0, 1), dla każdego piksela. I teraz chcę, żeby komputer wyobraził sobie że mam jakąś specyficzną powierzchnie opisaną bump mapą, w formie height mapy, tak by po jej interpretacji, na powierzchni płaskiej powstałaby iluzja wybitego napisu. Teraz rozumiesz? Nie wiem jak height mapę "skonwertować" na normal mapę i co będzie z tą starą wartością (oryginalną).
Skonwertowanie heightmapy na normal mapę wymaga od ciebie porównywania sąsiadów każdego piksela i wyliczanie w ten sposób psuedo pochodnych kierunkowych. I potem kolor otrzymany to jest kolor jaki tangent space'owa normal mapa tego piksela by miała. I ten kolor wykorzystujesz tak jak wcześniej robiłeś to z kolorem pobranym z piksela normal mapy. Jak chcesz mogę ci dokładnie powiedzieć jak to zrobić.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Ok, dajesz - najłatwiej jak się da  :D
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Ok. Musisz dokonać operacji konwolucji z takimi wagami:

Czyli na ludzkie. G = Texture(x-1, y-1)*w11 + Texture (x, y -1)*w21 + Texture(x+1, y-1) *w31+ ... Texture(x+1, y+1)*w33. Krótko mówiąc sumujesz sąsiadów przemnożonych przez wagi wzięte z tych macierzy. Otrzymujesz G_x i G_y. Jeśli masz je w przedziale np [0; 255] to przekształasz do [-1.0;1.0]. Tworzysz wektor trójwymiarowy w którym x=G_x, y=G_y, z = 1.0 i go normalizujesz. To jest twój wektor normalny.
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry