[C#] Oświetlenie 2D 26115 74

O temacie

Autor Sauron

Zaczęty 27.01.2015 roku

Wyświetleń 26115

Odpowiedzi 74

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
OK, teraz działa. Rzeczywiście nie skalowałem kąta światła do kąta spot'a. Tak więc dodałem taką linijkę i wywaliłem if'a:
angle = (float)Math.Max((angle - Math.Cos(spotAngle)) * (1 / (1 - (Math.Cos(spotAngle)))), 0);
spotAngle to kąt spota wyrażony w radianach.

Dalej, co do FalloffExponent. Jak mam to zrobić? Wg. mnie tak jak było jest dobrze :P Ew. spotęgować całość (razem z wygaszaniem), lub tylko wygaszanie (kDiffuse / distance). W każdym wypadku efekt jest podobny.

Dołączam zdjęcie:
 
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!
Jak ci wygaszanie zależne od kąta działa poprawnie to możesz teraz z powrotem włączyć wygaszanie odległościowe. Może być kwadratowe tak jak chciałeś wcześniej. Może być potęgowane do potegi równej FalloffExponent.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Ok, dzięki. Mam jeszcze jeden ciekawy pomysł :D Załóżmy że mam obraz sześcianu w rzucie: czarne krawędzie i alfe. Wszystko co przezroczyste wypełniam kolorem, czy jakąś teksturą (z tym sobie poradzę). I teraz na taki obraz chciałbym zastosować jakiś model oświetlenia. Tak więc z pewnością będzie mi potrzebna 'normal mapa'. I problem: jak czytać normalną z koloru?
 
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!
Zastępujesz normalne pikseli wartościami pobranym z tekstury (i znormalizowanymi z 0-225 do 0.0f - 1.0f). RGB odpowiadają XYZ normalnej. Będziesz normalne bake'ował zkądś czy jak? I czy masz już zdefiniowane wcześniej normalne tego sześcianu, czy normal mapa ma dopiero je zdefiniować? Pytam się, bo nie wiem czy będziemy potrzebowali normal mapy w object space czy w tangent space.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Mam już normal mapę. Zwykły obraz sześcianu z zaznaczonymi ścianami, każda na inny kolor. Nie potrzebuje generować. A przynajmniej na razie nie. Planuje robić tak, że "teksturę" zrobię sobie z normal mapy, czyli jak gdyby na odwrót.
 
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, czyli jak rozumiem będzie to normal mapa w object space. Po prostu nadpisuj wektor normalny piksela tym co wypróbkujesz z normal mapy i normalizuj do przedziału [0.0; 1.0]
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Działa :D A teraz z czystej ciekawości: object space, a tangent space, czyli o co chodzi?
 
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!
W grafice 3D. Object Space ustawia na sztywno normalkę tak jak każe tekstura. Tangent space ustawia normalkę biorąc pod uwagę normalne wierzchołków trójkąta na którego pikselach operuje. W praktyce OS przypisuje nową wartość a TS "odchyla" normalną o tyle ile każe tekstura.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Dzięki. Ech.... chyba nie ma tak dobrze... testowałem spota na kostce i światło nie wygląda jakby było na środku... Specular też mi nie chcę pasować. Może to wina normalnych?
Załączam obrazy:
Spoiler
tekstura (alfa zamienia się na pomarańcz):


Normal map'a:


Rezultat:


A tu spot:


Źródło światła na środku.
 
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!
Wyłącz tymczasowo specular. Wszystkie ściany są oświetlone tak samo zapewne. Jest to spowodowane tym, że każda ze ścian jest tak samo mocno odchylona od światła. Poprzesuwaj światło (do testów point light) i zobacz czy się sytuacja zmienia.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Bez specular'a ścianki i tak nie są takie same, tzn. podobnie jak wcześniej. Jak przesuwałem światło nadal wszystko dobrze. Może kostka nie jest na środku :P

EDIT:
Chyba coś jest w tej linijce:
Vector3 pos = new Vector3((i - halfX) / halfX, ((b.Height - i2) - halfY) / halfY, 0);
 
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!
raczej światło nie jest na środku kostki. Może miałeś na sztywno poustawiane relacje obraz - położenie w przestrzeni i jak zmieniłeś rozdzielczość obrazka to ci się rozjechało?
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Raczej nie możliwe. Mam wszystko wyskalowane od 0 do 1 (patrz: post wyżej - edit). Jeszcze jutro zobaczę, ew. mogę Ci wysłać kod :P
 
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!
Swoją drogą do takich rzeczy wydajniejsze jest używanie shaderów młócących na GPU zamiast robienia tego na CPU.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Domyślam się. Taką kosteczkę generuje mi w czasie ok. 1 sekundy. Z przyjemnością puściłbym to na GPU tylko powiedz mi jak (pomijając OpenGL i DirectX)  :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!
Bez OpenGL i Direct3D nie da rady (chyba, że byś spróbował w CUDA lub OpenCL, ale wtedy to będzie jeszcze większy hardkor). Możesz spróbować z XNA. To jest framework C#rpowy który używa DirectX, ale trochę ułatwia programowanie. Framework implementuje DirectX 9.0c. Możesz na to rzucić okiem.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy

Sauron

[C#] Oświetlenie 2D
#36 2015-03-23, 13:34(Ostatnia zmiana: 2015-03-23, 15:05)
Ok, nowe odkrycie. Jak ustawię sobie normalną na (0, 0, 1) dla każdego piksela (zamiast brać z mapy) to spot jest na środeczku.... Jaki związek ma normalna z pozycją spota?

EDIT:
Zrobiłem takie coś z normalnymi i działało.
normal.X -= 0.5f;
normal.Y -= 0.5f;
Wydaję mi się, że trochę inaczej traktuję normalne. Jak oświetlałem płaszczyznę to normalną miałem ustawioną na (0, 0, 1), a więc środek i 1 jednostka "z monitora". Na normal mapie był to kolor (127, 127, 255), a więc normalna (0.5, 0.5, 1)... O co chodzi?

EDIT2:
Już znalazłem :P Chodziło o reprezentacje liczb ujemnych itp.

Co byś powiedział na AO :D Dałoby się to wygenerować? Jest to łatwe?
 
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!
Cóż... AO można wygenerować precyzyjnie bake'ując z modelu. Z tekstury można mniej precyzyjnie - możesz próbować wygenerować teksturę od AO xNormalowym pluginem do photoshopa. Możesz też próbować liczyć AO w realitime jakimś SSAO, ale na CPU to pewnie by bardzo męczyło maszynę. No i do tego i tak byś potrzbował dodatkową teksturę pomocniczą - mapę wysokości.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Hmmm... z mapą wysokości chyba nie powinno być problemu, a przynajmniej nie w tym przypadku (sześcian). Jak taką mapę się generuję? Jak ona działa? 

Przypuśćmy, że mam teksturę, normal mapę i height mapę. Jak wygenerować AO? Tak żebym nie musiał używać innych programów - chcę wszystko samemu :P
 
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!
Samemu? Albo SSAO, albo samemu puszczać z każdego piksela po 100 raycastów xD
 
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