Piszę mały izometryczny silnik 2d w C ++ i próbuję zaimplementować rzucanie cieni w czasie rzeczywistym. Postępowałem zgodnie z prostym podejściem opisanym na tej stronie i oto wynik (światło znajduje się w tym samym miejscu co żółty sześcian):
Rezultat jest bardzo ładny, ale na ścianach i na kostkach brakuje cieni. Oto przykład, jak powinien on wyglądać (narysowałem oczekiwane cienie na zielono):
Wszystkie narysowane kostki są po prostu wykonane z 3 kwadratów 2D umieszczonych w pozycji XY i o głębokości Z (z = x + y). Używam OpenGL z matrycą ortograficzną (glOrtho). Cienie są rysowane za pomocą bufora szablonów.
Szukam zasobów lub rozwiązań, które pomogłyby mi ukończyć tę implementację rzutowania w tle.
Wielkie dzięki!
Odpowiedzi:
W przypadku dachu i ścian możesz spróbować określić przecięcia między segmentami ściany i wygenerowanymi obszarami cieni. Potrzebujesz dwuprzebiegowego renderowania cieni. Pierwszy zrobi to, co robisz dzisiaj (w pamięci). Drugie przejście obliczy przecięcia dachu i ściany. Ostatni etap to prawdziwy rendering. DeadMG się myli, możesz to zrobić.
Uwaga: w przypadku dachu należy przeciąć obszar cienia i obszar dachu.
źródło
Zasadniczo nie można zrobić tego, czego szukasz. Chcesz wziąć kilka obiektów 2D i sprawić, by rzucały cienie, jakby były obiektami 3D. Jeśli chcesz mieć pełne cienie 3D, musisz mieć obiekty 3D.
źródło
Opisane rozwiązanie nie jest pełne 3D, ponieważ nie potrzebuje pełnego rozwiązania 3D. Będzie to wyglądać, ale tak nie jest. Tworzenie rzucania cieni należy traktować jako przecięcie objętości. To, czego potrzebuje, jest mniej skomplikowane. Pamiętaj (jeśli posiadasz znanego) zagłady i zagłady, takie jak silnik renderowania. Wszystkie przetwarzanie przeprowadzono w dwóch wymiarach.
źródło
Biorąc pod uwagę, że chcesz, aby ta gra była mała, co powiesz na to, że obecna implementacja cienia jest wystarczająco dobra?
Przyznaję, że nie widziałem tego w akcji, to znaczy nie widziałem, jak niepokojące lub niezakłócające będą niedoskonałości cienia, gdy gry będą działać na żywo z dynamicznymi obiektami i dynamicznymi źródłami światła, ale sądząc po twoich obrazach, „ bardzo chciałbym powiedzieć „jest wystarczająco dobry, teraz skup się na ukończeniu gry”. Jeśli obecna implementacja będzie mała i zostanie wykonana szybko, a naprawienie tego, co uważasz za problemy, spowoduje, że kod będzie duży i powolny, myślę, że lepiej nie martwić się o te cienie.
Wiem, wiem, sugerowanie „nie próbuj rozwiązać problemu”, ponieważ rozwiązanie problemu może być złą praktyką. Mimo to szczerze chcę powiedzieć, że jest naprawdę dobry, jeśli chcesz mieć niewielki ślad w kodzie.
źródło