Inna twórczość > Platforma .NET

[C#] Oświetlenie 2D

(1/15) > >>

Sauron:
Witam. Problem dotyczy oświetlenia płaskiej powierzchni. Udało mi się uwzględnić światło rozproszone, niestety mam problem z odbitym. Próbowałem robić coś takiego:


--- Kod: ---Vector3 light_direction = new Vector3(500, 500, 500);
Vector3 normal = new Vector3(0, 0, 1);
Vector3 eye = new Vector3(500, 500, 1);
for(int i =0;i<=b.Width - 1;i++)
{
    for(int i2 = 0;i2<=b.Height - 1;i2++)
    {
        Vector3 pos = (i, i2, 0);
        Vector3 lightToSurface = pos - light_direction;
        Vector3 reflection = lightToSurface - 2 * Dot(lightToSurface, normal) * normal;
        float specularAngle = Dot(reflection.Normalize(), eye.Normalize());
        float specular = (float)Math.Pow(specularAngle, 5);
    }
}

--- Koniec kodu ---

Potem do specular dodaję diffuse i mnożę razy kolor. Efekt nie wygląda zbyt dobrze. Światło odbite to tylko 1 oświetlony piksel w centrum obrazu. Jak "powiększyć" ten obszar?

Dodam, że obraz ma rozmiary 1000x1000 i leży na płaszczyźnie X (tzn. Z jest zawsze równe 0).

A i jeszcze jedno: jaki związek ma intensywność światła rozproszonego od odległości jego źródła?

mgr Fartuess:
 Intensywność światła rozproszonego od odległości jest zależna przy świetle punktowym, która jak widzę tutaj wyliczasz. Co do błędów to nawet mi trudno wychwycić... rozumiem, że testowałeś różne wartości potęgi pod specularAngle.

Sauron:
Wiem, że jest zależna, ale jak? Ja uwzględniam tylko kąt, ale gdyby postawić dwie płaszczyzny obok siebie, jedna dalej światła, inna bliżej i każda z nich byłaby oświetlana osobnym źródłem, to więcej światła dotrze do punktu bliższego. Chyba nikt nie zaprzeczy?

EDIT:
Nie odjąłem punktu zaczepu wektora, powinno być tak:

--- Kod: ---Dot(reflection.Normalize(), (eye - pos).Normalize());
--- Koniec kodu ---

Niby teraz powinno być dobrze, ale chyba jednak nie  :hmmm: Jeżeli wykładnik potęgi ustawie na 2, to specular (sam, bez diffuse) wygląda tak (przypomnę, że "kamera" jest na środku, tak jak źródło światła):

http://ifotos.pl/z/wxhqpss

EDIT2: Udało się. Zmieniłem odległość kamery od powierzchni (wcześniej było 1, teraz 500). Zapomniałem, że nie mogę wpisać sobie byle czego, tak jak w normalnej  :lol: Jak powinienem liczyć kolor końcowy?

mgr Fartuess:
Podejścia do koloru końcowego są różne. Ogólnie sumuje się wynik z diffuse'a z wynikiem ze speculara. Diffuse przemnaża się przez teksturę koloru diffuse a specular przez kolor tekstury speculara lub pozostawia się nieprzemnożony dla dielektryków lub przemnożony mniej więcej przez diffuse dla metali.

Co do wygaszania:

albo jeśli chcesz customowy factor wygaszania:

Sauron:

--- Cytuj ---Podejścia do koloru końcowego są różne. Ogólnie sumuje się wynik z diffuse'a z wynikiem ze speculara. Diffuse przemnaża się przez teksturę koloru diffuse a specular przez kolor tekstury speculara lub pozostawia się nieprzemnożony dla dielektryków lub przemnożony mniej więcej przez diffuse dla metali.
--- Koniec cytatu ---
A ambient? Słyszałem też o emit, ale nie mam pojęcia co to jest. A jak to jest z innymi typami światła, np. "spot light"?

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej