2011-07-12 10 views
7

Pracuję nad aplikacją OpenGL 2.1 za pomocą shaderów i mam problem z oświetleniem per-fragment. Oświetlenie jest poprawne, gdy moja scena się ładuje, ale kiedy poruszam się po scenie, oświetlenie porusza się z "kamerą", zamiast pozostać w statycznej lokalizacji. Na przykład, jeśli odłożę światło w prawo, prawa strona obiektów zostanie podświetlona. Jeśli następnie przesuniemy kamerę na drugą stronę obiektu i wskażę w przeciwnym kierunku, oświetlenie nadal znajduje się po prawej stronie obiektu (zamiast znajdować się po lewej stronie, tak jak powinno teraz). Zakładam, że obliczam oświetlenie w niewłaściwym układzie współrzędnych, a to powoduje niewłaściwe zachowanie. Jestem obliczania oświetlenia następujący sposób ...układ współrzędnych oświetlenia per-fragment

W cieniowania wierzchołków ...

ECPosition = gl_ModelViewMatrix * gl_Vertex; 
WCNormal = gl_NormalMatrix * vertexNormal; 

gdzie vertexNormal jest normalną w przestrzeni obiektu/modelu.

W cieniującego fragmentu ...

float lightIntensity = 0.2; //ambient 
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse 

gdzie LightPosition jest, na przykład, (100,0, 10,0, 0,0), co może narazić na światło po prawej stronie na świecie, jak opisano powyżej. Częścią, której nie jestem pewien, jest część gl_NormalMatrix. Nie jestem do końca pewien, czym jest ta matryca i jaka jest jej współrzędna, w którą wpisuję moje normalne (zakładam przestrzeń światową). Jeśli normalny zostanie umieszczony w przestrzeni świata, wtedy pomyślałem, że problem polega na tym, że ECPosition jest w przestrzeni oka, podczas gdy LightPosition i WCNormal są w przestrzeni świata. Coś w tym nie wydaje się właściwe, ale nie mogę tego rozgryźć. Próbowałem także umieścić ECPosition w przestrzeni świata, mnożąc ją przez mój własny modelMatrix, który zawiera tylko transformacje, które robię, aby uzyskać współrzędne w przestrzeni świata, ale to nie zadziałało. Daj mi znać, jeśli chcę podać inne informacje na temat moich shaderów lub kodu.

Odpowiedz

6

gl_NormalMatrix przekształca twoją normalną w przestrzeń oczu (więcej szczegółów znajdziesz w artykule this tutorial).

Myślę, że aby twoje światło było na statycznej pozycji na świecie, powinieneś przekształcić swoją Pozycję Światła w przestrzeń oczu, pomnażając ją przez swoją bieżącą matrycę widoku.

+0

dobry samouczek o gl_NormalMatrix. Rozumiem to teraz. Spróbuję przekształcić moją LightPosition w przestrzeń oczu i zobaczyć, co się stanie. Dobra sugestia. – Nitrex88

+0

tak, zadziałało! Ma sens ... dzięki kolego! – Nitrex88

Powiązane problemy