Autor Wątek: Oświetlenie  (Przeczytany 2264 razy)

Offline kapustman

  • Użytkownik

# Luty 16, 2015, 20:08:36
Witam! Mam mały problem z oświetleniem.   Jak widać na obrazku (na lewo od czerwonego kwadratu), oświetlenie działa dobrze tylko wtedy, gdy na obiekt światło pada z prawej strony. A po prawej od kwadratu, nic nie działa tak jak powinno.



Tutaj kod pixel shadera ( ld = pozycja wierzchołka - pozycja światła):
float4 psmain(float2 texc : TEXCOORD0,float2 ld : TEXCOORD1) : COLOR
{
float4 tex = tex2D(sampler0,texc);
float3 normal = tex2D(sampler1,texc);

float3 light_dir = float3(ld,0);
float dist = length(light_dir);
light_dir = normalize(light_dir);

tex.rgb *= float3(1,1,0.2);
tex.rgb *= (1.15) / ( 0.5 + (dist * dist * 0.000015));
tex.rgb *= dot(normal,light_dir);

return tex;
}
« Ostatnia zmiana: Luty 16, 2015, 22:02:27 wysłana przez kapustman »

Offline Mr. Spam

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

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 16, 2015, 20:20:33
Polecam:

float3 normal = normalize( tex2D(sampler1,texc)*2 - 1 );

Offline kapustman

  • Użytkownik

# Luty 16, 2015, 20:37:07
Wtedy otrzymuję coś takiego:



Normalną otrzymuję z normal map, raczej nie ma potrzeby normalizowania tego. Jest już lepiej, bo chociaż na krawędziach już jest dobre oświetlenie.
« Ostatnia zmiana: Luty 16, 2015, 22:04:52 wysłana przez kapustman »

Offline Krzysiek K.

  • Moderator
    • DevKK.net

  • +4
# Luty 16, 2015, 22:06:21
Cytuj
Wtedy otrzymuję coś takiego:
No i jest nieźle. Reszta to kwestia liczenia wektora światła.
1) Światło masz w tej samej płaszczyźnie co obiekty, więc siłą rzeczy nie może ono oświetlić ich frontu. Przesuń światło trochę w osi Z (wartość dobrać do smaku) i będzie OK.
2) Masz normalki lub światło odwrotnie w osi Y (obiekt pod światłem rozjaśniony jest od dołu zamiast od góry). Trzeba zanegować współrzędną Y wektora "ld", najlepiej w vertex shaderze.

Cytuj
Normalną otrzymuję z normal map, raczej nie ma potrzeby normalizowania tego.
A na mipmapach też masz ponormalizowane? ;) Jeżeli tak i nie używasz speculara, to będzie OK. Normalmapa jest przecież samplowana, co to oznacza uśrednianie do 8 różnych próbek z tektury - a jak uśredniamy znormalizowane wektory, to wynik może być już krótszy od jedności co się przełoży nieco na jasność oświetlenia diffuse i drastycznie na jasność speculara (tam efekt jest podniesiony do potęgi - dosłownie).

Offline kapustman

  • Użytkownik

# Luty 17, 2015, 22:39:38
Dziękuję! Teraz wszystko działa tak jak chciałem. Zadam jeszcze jedno pytanie, żeby nie zakładać nowego tematu. Jak mam rozwiązać sprawę rysowania dynamicznych cieni dla wielu świateł w 2D? Jakieś podpowiedzi, sugestie?
« Ostatnia zmiana: Luty 17, 2015, 23:18:44 wysłana przez kapustman »

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 18, 2015, 00:39:43
Jak mam rozwiązać sprawę rysowania dynamicznych cieni dla wielu świateł w 2D? Jakieś podpowiedzi, sugestie?
A w czym jest problem?

Offline kapustman

  • Użytkownik

# Luty 18, 2015, 12:28:00
Nigdy nie potrzebowałem cieni, i nie wiem od czego zacząć, jak to się robi.

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 18, 2015, 15:17:25
Zawsze najlepiej zacząć od szukania w necie. Wystarczy wpisać "2D shadow" a już wyskakuje cała masa tutoriali i przykładów.