Saya ingin mencoba menambahkan bayangan ke game 3D XNA. Saya telah menyiapkan beberapa lingkungan pengujian dengan satu lampu dan satu kamera. Namun, saya menemukan artefak dengan pendekatan saya.
Saya menggunakan kode shader dari http://pastebin.com/zXi0hmsU untuk membuat hasil akhir dan http://pastebin.com/rY4Gcj9N untuk membuat peta bayangan. Kode ini cukup lurus ke depan dan melibatkan pembuatan peta kedalaman dari sudut pandang cahaya, kemudian memproyeksikannya ke ruang kamera dan memeriksa oklusi.
Namun, dari sebagian besar sudut saya mendapatkan hasil yang sangat jelek
Adegan ini terdiri dari beberapa kubus sederhana (dibangun dengan tangan, menghadap ke luar, backface dimusnahkan), satu cahaya (peta bayangan ditampilkan di sudut kiri atas - terlihat oke) dan satu kamera.
Target RenderTarget saya untuk peta bayangan diinisialisasi oleh
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;
Setelah itu, CreateShadowMap
efek diterapkan, diikuti oleh efek LambertWithShadows. Akhirnya, peta bayangan digambar menggunakan a SpriteBatch
.
Sisa kode terdiri dari sekadar memberikan nilai yang benar kepada shader. Jika perlu, saya bisa menyediakannya dengan baik.