Autor Wątek: specular - granica  (Przeczytany 4334 razy)

Offline skalniak

  • Użytkownik
    • Home page

# Styczeń 10, 2006, 16:38:37
czesc, troche sobie teoretyzuje i planuje i natrafilem na problem. Chodzi o oswietlenie specular. Wiadomo ze mozna nie oswietlac tych scian ktore sa tylem do zrodla swiatla a w przypadku swiatla rozproszenia (diffuse) mozna wykluczyc te sciany ktore sa tak daleko od zrodla ze nie sa oswietlane. Jak jest ze specularem ? Przecierz swialo odbicia jest nawet tam gdzie swiatlo diffuse nie zawsze "dojdzie" . Musi byc jakas granica po przekroczeniu ktorej sciana nie jest oswietlana wogole przez dane zrodlo swiatla :/

Pozdr. skalniak

Offline Mr. Spam

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

nadult

  • Gość
# Styczeń 10, 2006, 17:44:40
Wzorki (z manuala do directx [programming guide/getting started/lights]) w uproszczeniu:
Atten = 1/( att0i + att1i * d + att2i * d2)
Specular = color *Dotproduct(N,H)reflection * Atten * Spot
Diffuse= color*DotProduct(N,Ldir)*Atten*Spot

N,H,Ldir-wektory znormalizowane
Iloczyn skalarny wektorów znormalizowanych jest <= 1 (chyba :)). Spot <= 1.
Po przemnożeniu kolor jest przycinany do przedziału [0;256] i zaokrąglany.
Czyli dla atenuacji z przedziału [0;1/512] kolor wynikowy jest równy 0 (dla dowolnych il. skal. i spot).

Rozw. uklad rownan:
1/(att0+att1*d+att2*d2)<1/512
att0+att1*d+att2*d2>512
dalej proste

nie sprawdzałem, mam nadzieje że działa  ;D



« Ostatnia zmiana: Styczeń 10, 2006, 17:58:13 wysłana przez nadult »

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Styczeń 10, 2006, 20:28:56
Cytuj
Chodzi o oswietlenie specular. Wiadomo ze mozna nie oswietlac tych scian ktore sa tylem do zrodla swiatla a w przypadku swiatla rozproszenia (diffuse) mozna wykluczyc te sciany ktore sa tak daleko od zrodla ze nie sa oswietlane. Jak jest ze specularem ?
Ze specularem jest tak samo jak z diffuse. Jasność światła maleje zgodnie z równaniem 1/dist^2, gdzie dist jest odległością światła od ściany.

Cytuj
Musi byc jakas granica po przekroczeniu ktorej sciana nie jest oswietlana wogole przez dane zrodlo swiatla :/
Nie ma takiej granicy. Zgodna z fizyką funkcja 1/x^2 maleje bardzo wolno i nigdy nie osiąga zera. W swoim silniku korzystam z nieco mniej poprawnej funkcji 1/x^2-k (k - jakaś stała, u mnie 0.2, o ile pamiętam), dzięki czemu wygląda to podobnie, a w pewnej odległości oświetlenie zanika zupełnie. Jak pisałem powyżej, ten wzór stosuje się zarówno do speculara, jak i do diffuse. :)

nadult

  • Gość
# Styczeń 11, 2006, 18:59:09
Sprawdziłem mój pomysł (tylko dla diffuse ale dla specular jest analogicznie) i wyszło że działa.

Ostateczny wzór na range z atenuacji:
range = (sqrt(att1*att1+4*att2*(2bits+1-att0))-att1)/(2*att2)
bits = ilość bitów na składową koloru

Trzeba tylko rozpatrzyć przypadki gdy att2=0 i att1=0.

//EDIT: Oczywiście to jest ograniczenie z góry. Pewnie da się to jeszcze jakoś zmniejszyć.
« Ostatnia zmiana: Styczeń 11, 2006, 19:06:07 wysłana przez nadult »

Offline skalniak

  • Użytkownik
    • Home page

# Styczeń 11, 2006, 23:09:59
sporo sie wyjasnilo , dzieki. Te sposoby sa w wiekszosci przypadkow skuteczne. ALe dzialaja dla sciany bo chyba nikt nie bedzie sprawdzal dynamicznie takich zaleznosci per pixel , a sa sytuacje (swiatlo na srodku duzej sciany) gdzie te sposoby nie zadzialaja, ja wymyslilem ze mozna by sprawdzac dla kazdego wierzcholka sciany oraz dla srodka sciany/ trojkata- jakies rozwiazanie przyblizone to jest.

Pozdr. skalniak