[C#] Oświetlenie 2D 31055 74

O temacie

Autor Sauron

Zaczęty 27.01.2015 roku

Wyświetleń 31055

Odpowiedzi 74

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Ok, a co jak jestem w punkcie (0, 0)? Liczb ujemnych nie może być. I czy zawsze z=1? Z czego to wynika?
 
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!
próbkując sąsiadów to tak naprawdę dajesz max(x-1, 0), min (x+1, width-1), max(y-1, 0), min(y+1, height -1) (zakładam że dajesz indeksy do pikseli a nie masz obraz przeskalowany do skali [0.0; 1;0) jak to jest w próbkowaniu obrazów wewnątrz shaderów).

Z=1.0 masz na początku, ale po znormalizowaniu się skróci. x i y tego wektora możesz przeskalować przez skalar, żeby wzmocić lub osłabić wynikową normal mapę.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Też coś Ci nie pasuję?

Heightmap'a:


Wygenerowana normal map'a:
 
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
#63 2015-04-08, 22:35(Ostatnia zmiana: 2015-04-08, 22:43)
Po pierwsze zamień R z G (chociaż jeśli masz je zamienione też w liczeniu światła z normal mapy to nie ma takiej potrzeby, chociaż jeśli chcesz móc używać zewnętrznych normal map np z Xnormala i wygenerowanych to możesz próbować zrobić tak by było to ze sobą zgodne). Po drugie ten niebieski jest jakiś za ciemny. Prawdopodobnie dlatego, że jak wyświetlasz go jako obraz to nie możesz mieć koloru w zakresie [-1;1] tylko przeskalowany do [0; 255]. Ale do użycia w oświetleniu potrzebujesz waśnie [-1;1].

Generator który napisałem samemu jakieś 3 miesiące temu daje mi takie efekty dla twojej tekstury wejściowej:

Ale oczywiście używając tej tekstury pierwsze co bym zrobił to przeskalowanie zakresów do [-1;1] dla RG i [0;1] dla B

Chcesz to od razu przepchnąć do liczenia oświetlenia, czy przez cały pipeline tak samo jak tekstury normalek z pliku?
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Cytuj
 Otrzymujesz G_x i G_y. Jeśli masz je w przedziale np [0; 255] to przekształasz do [-1.0;1.0].
Tym mnie zmyliłeś :P Napisałem takie coś:
float x = (Gx - 127f) / 127f; //skalowanie do [-1,1]
float y = (Gy - 127f) / 127f; //j.w.float z = 1f;

Vector3 normal = new Vector3(y, x, z).Normalize(); //tutaj zamieniam kolorki - jak mówiłeś
normal /= 2;
normal += new Vector3(0.5f, 0.5f, 0.5f);

int cr = (int)(normal.X * 255);
int cg = (int)(normal.Y * 255);
int cb = (int)(normal.Z * 255);

Color c = Color.FromArgb(cr, cg, cb);
I wynikiem były takie ciemne kolory.

Zmieniłem na (reszta taka sama):
float x = Gx / 255f;
float y = Gy / 255f;
float z = 1f;
 
I mam takie coś:


Niby takie samo, ale jednak nie - tam gdzie ty masz szczyty, ja mam doliny :P O co chodzi?

Czy Gx i Gy mogą być ujemne?
 
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!
Możliwe, że masz zamienione Gx i Gy. Może musisz zinwertować wyniki z jednego kanału. Np Gx = 255 - Gx.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Nie, nie, nie. To odwróci mi kolorki. Bawiłem się wartościami Gx i Gy (to z macierzą) i udało mi się "dźwignąć" te doliny, odwracając znaki. Za to coś się sypnęło z orientacją w poziomie. Tu masz kod (wiem - dużo kodu, dało się w kilku linijkach):

int x11 = MinMax(i - 1, 0, b.Width - 1);int x12 = MinMax(i, 0, b.Width - 1);
int x13 = MinMax(i + 1, 0, b.Width - 1);
int y11 = MinMax(i2 - 1, 0, b.Height - 1);
int y12 = MinMax(i2 - 1, 0, b.Height - 1);
int y13 = MinMax(i2 - 1, 0, b.Height - 1);

int x21 = MinMax(i - 1, 0, b.Width - 1);
int x22 = MinMax(i, 0, b.Width - 1);
int x23 = MinMax(i + 1, 0, b.Width - 1);
int y21 = MinMax(i2, 0, b.Height - 1);
int y22 = MinMax(i2, 0, b.Height - 1);
int y23 = MinMax(i2, 0, b.Height - 1);

int x31 = MinMax(i - 1, 0, b.Width - 1);
int x32 = MinMax(i, 0, b.Width - 1);
int x33 = MinMax(i + 1, 0, b.Width - 1);
int y31 = MinMax(i2 + 1, 0, b.Height - 1);int y32 = MinMax(i2 + 1, 0, b.Height - 1);
int y33 = MinMax(i2 + 1, 0, b.Height - 1);


int v11 = b.GetPixel(x11, y11).R;
int v12 = b.GetPixel(x12, y12).R;
int v13 = b.GetPixel(x13, y13).R;
int v21 = b.GetPixel(x21, y21).R;
int v22 = b.GetPixel(x22, y22).R;
int v23 = b.GetPixel(x23, y23).R;
int v31 = b.GetPixel(x31, y31).R;
int v32 = b.GetPixel(x32, y32).R;
int v33 = b.GetPixel(x33, y33).R;

int Gx = -v11 - 2 * v12 - v13 + v31 + 2 * v32 + v33; //tu zmieniałem znaki
int Gy = -v11 + v13 - 2 * v21 + 2 * v23 - v31 + v33; //i tu
 
Ten "błąd" w Twoim poście z macierzami był celowy? Mam na myśli oznaczanie danych macierzy (kolumna, wiersz):
Cytuj
G = Texture(x-1, y-1)*w11 + Texture (x, y -1)*w21 + Texture(x+1, y-1) *w31+ ... Texture(x+1, y+1)*w33. 
(x, y-1) to środek górnego wiersza,  a w21 to pierwsza wartość drugiego wiersza :hmmm:
 
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, nie, nie. To odwróci mi kolorki. Bawiłem się wartościami Gx i Gy (to z macierzą) i udało mi się "dźwignąć" te doliny, odwracając znaki. Za to coś się sypnęło z orientacją w poziomie. Tu masz kod (wiem - dużo kodu, dało się w kilku linijkach):
Odwrócenie znaków w macierzy wag da te same efekty co inwersja odpowiadającej mu pochodnej odpowiadającej temu samemu kierunkowi tj G_i = 255 - G_i. Ogólnie mówiąc nie ma znaczenia w którym miejscu zrobisz tego fixa.

Ten "błąd" w Twoim poście z macierzami był celowy? Mam na myśli oznaczanie danych macierzy (kolumna, wiersz):
Cytuj
G = Texture(x-1, y-1)*w11 + Texture (x, y -1)*w21 + Texture(x+1, y-1) *w31+ ... Texture(x+1, y+1)*w33.
(x, y-1) to środek górnego wiersza,  a w21 to pierwsza wartość drugiego wiersza :hmmm:

Podałem to wg matematycznej notacji macierzowej, czyli Mij, gdzie M to macierz, i to wiersz a j to kolumna. Z tego samego powodu indeksowałem od jedynki a nie od zera ;)
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Cytuj
Odwrócenie znaków w macierzy wag da te same efekty co inwersja odpowiadającej mu pochodnej odpowiadającej temu samemu kierunkowi tj G_i = 255 - G_i. Ogólnie mówiąc nie ma znaczenia w którym miejscu zrobisz tego fixa.
Nie. Przynajmniej nie u mnie, może mam coś źle. Jak napiszę Gx = 255 - Gx, to normal mapa ma odcienie... turkusowe, a Gy = 255 - Gy różowe.

Cytuj
Podałem to wg matematycznej notacji macierzowej, czyli Mij, gdzie M to macierz, i to wiersz a j to kolumna. Z tego samego powodu indeksowałem od jedynki a nie od zera ;)
i - wiersz, j - kolumna:
w21: 2 wiersz, 1 kolumna:

|            |          |          |
|  tutaj  |           |         |
|            |          |          |

Napisałeś tak: Texture (x, y -1)*w21

                       tutaj
                          |
| (x-1,y-1)  | (x, y-1) | (x+1, y-1) |
| (x-1, y)     |   (x, y)   |  (x+1, y)  |
| (x-1,y+1) | (x,y+1) | (x+1,y+1) |

Pomyliłeś się ;)
 
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!
masz rację Mij kolumna i wiersz j. Tak jak się czyta. Moja wina.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Zmieniłem znaki w macierzach i działa. Dlaczego? Co miałem źle?

Cytuj
Po pierwsze zamień R z G(...)
Dlaczego? :D

BTW:
Cytuj
Odwrócenie znaków w macierzy wag da te same efekty co inwersja odpowiadającej mu pochodnej odpowiadającej temu samemu kierunkowi tj G_i = 255 - G_i. Ogólnie mówiąc nie ma znaczenia w którym miejscu zrobisz tego fixa.
Nie chodziło Ci o, np. Gx = -Gx? Bo mi wydaję się to działać.
 
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
#71 2015-04-10, 16:02(Ostatnia zmiana: 2015-04-10, 16:08)
Zmieniłem znaki w macierzach i działa. Dlaczego? Co miałem źle?
Wartości XY wektora miałeś przeciwne. Możesz albo je sobie odwrócić potem, albo zmienić znaki w macierzach sobela, żeby od razu generowało dobrze. Nie ma to zbytnio znaczenia jak to zrobisz.

Cytuj
Po pierwsze zamień R z G(...)
Dlaczego? :D
Mogłem to źle ocenić, ale czasem przez pomyłkę mogą być one zamienione. Wtedy albo zamieniasz X,Y (R,G) albo zamieniasz ze sobą macierze sobela. No, ale jeśli wszystko wygląda już dobrze, to nie musisz tego robić.

Nie chodziło Ci o, np. Gx = -Gx? Bo mi wydaję się to działać.
W przestrzeni [-1.0; 1.0] tak będzie zrobiona inwersja. W przestrzeni [0; 255] już raczej inaczej.
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Ważne że wszystko działa :P
Fartuess - kłaniam się  :bows: Brawo!
 
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!
Z odpowiednimi przeróbkami i po wyprowadzeniu większych macierzy do wykrywania krawędzi (matma stojąca za sobelem) można z tego zrobić generator normalmap jak z Crazybumpa.

Jeśli chcesz iść dalej i zrobić displacement mapping, to tutaj linkuje ci materiały których ja używałem gdy go implementowałem u siebie. Są nowsze i szybsze metody, ale one są raczej bardziej skomplikowanym rozwinięciem tego samego.

http://graphics.cs.brown.edu/games/SteepParallax/index.html
http://graphics.cs.brown.edu/games/SteepParallax/mcguire-steepparallax.pdf
 
Popisuje się ciągle menda jedna...

Sauron

Sauron

Użytkownicy
posty267
Propsy5
Profesjabrak
  • Użytkownicy
Ok, poczytam. Dzięki!
 
Ash nazg durbatulûk, ash nazg gimbatul,
ash nazg thrakatulûk agh burzum-ishi krimpatul.


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