Artefakty mapy cienia

16

Chcę spróbować dodać cienie do gry 3D XNA. Skonfigurowałem środowisko testowe z jednym światłem i jedną kamerą. Jednak w moim podejściu natrafiam na artefakty.

Używam kodu modułu cieniującego z http://pastebin.com/zXi0hmsU do renderowania końcowego wyniku i http://pastebin.com/rY4Gcj9N do tworzenia map cieni. Kod jest dość prosty i polega na wygenerowaniu mapy głębokości z lekkiego punktu widzenia, a następnie wyświetleniu jej w przestrzeni kamery i sprawdzeniu okluzji.

Jednak z większości punktów widzenia mam dość brzydkie wynikijak na tym zrzucie ekranu

Scena składa się z kilku prostych kostek (zbudowanych ręcznie, skierowanych na zewnątrz, tylna ścianka jest wygięta), jednego światła (mapa cienia pokazana w lewym górnym rogu - wygląda dobrze) i jednej kamery.

Mój RenderTarget dla map cieni jest inicjowany przez

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Następnie stosuje się CreateShadowMapefekt, a następnie efekt LambertWithShadows. Na koniec mapa cienia jest rysowana za pomocą SpriteBatch.

Reszta kodu polega po prostu na dostarczeniu poprawnych wartości do programów cieniujących. W razie potrzeby mogę to dobrze podać.

Etan
źródło

Odpowiedzi:

19

Jest to typowy problem zwany trądzikiem mapy cienia . Jest to spowodowane tym, że rzutowany piksel mapy cieni (głębokość) jest większy niż piksel na ekranie (równanie nie może poprawnie przedstawić głębokości).

wprowadź opis zdjęcia tutaj

Istnieje wiele rozwiązań tego. Najpierw najłatwiej jest odchylenie (widzę to w twoim kodzie, więc to nie jest problem). Drugim łatwym rozwiązaniem jest mapa cieni w większej rozdzielczości, naprawdę bardziej niż typowe jest posiadanie map cieni w rozdzielczości 2048x2048 na bieżącym sprzęcie. (EDYCJA: to nieprawda, napisałem to, kiedy pracowałem nad renderowaniem filmów. W rozwoju gry chcesz zachować jak najmniejszą mapę cieni)

Niektóre zasoby do studiowania bardziej zaawansowanych technik.


edytować:

Notabene
źródło
Mam jeszcze kilka materiałów na ten temat w pracy, jeśli jesteś zainteresowany, ja też się nim podzielę.
Notabene
Głównym problemem przy dużych rozdzielczościach jest to, że w końcowej grze mam około 3-4 świateł, które nie są przekierowane => Będę musiał tam użyć sześciennych map cieni, co daje 24 mapy cieni. Jeśli masz dodatkowe materiały, naprawdę doceniam twój wysiłek, aby podzielić się ze mną :-)
Etan
Interesuje mnie przynajmniej, jeśli to ma znaczenie :)
James
1
@Etan. Tak, światła dookólne są prawdziwym bólem, jeśli mówimy o cieniach. (wiem coś na ten temat :) gamedev.stackexchange.com/questions/6203/… ). Spróbuj użyć podwójnych map paraboloidalnych. Lub jeśli lubisz mapy kubaturowe, spróbuj zaoszczędzić trochę miejsca, wygładzając przecięcie frustum-camera_frustum dla każdej twarzy / renderowania. Prawdopodobnie nie będziesz potrzebować cienia przez cały czas (szczególnie na zewnątrz)
Notabene
1
@Etan @James Dodałem dla ciebie trochę więcej rzeczy. Oba warto przeczytać, jeśli jesteś zainteresowany tym tematem.
Notabene