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 wyniki
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ę CreateShadowMap
efekt, 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ć.