Artefak peta bayangan

16

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 jelekseperti di screenshot ini

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, CreateShadowMapefek 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.

Etan
sumber

Jawaban:

19

Ini adalah masalah khas yang disebut bayangan peta jerawat . Ini disebabkan karena pixel yang diproyeksikan dari peta bayangan (kedalaman) lebih besar dari piksel pada layar (mis. Tidak dapat mewakili kedalaman dengan benar).

masukkan deskripsi gambar di sini

Ada banyak solusi untuk ini. Pertama yang paling mudah adalah bias (saya melihatnya dalam kode Anda, jadi itu bukan masalah). Dan solusi mudah kedua adalah bayangan peta dalam resolusi lebih besar, itu benar-benar lebih dari biasanya untuk memiliki shadowmap di resolusi 2048x2048 pada hw saat ini. (EDIT: itu tidak benar, saya sudah menulis bahwa ketika saya sedang mengerjakan rendering film. Dalam pengembangan game, Anda ingin membuat Anda membuat peta bayangan sekecil mungkin)

Beberapa sumber untuk mempelajari teknik yang lebih maju.


edit:

Notabene
sumber
Saya memiliki beberapa materi tentang topik ini dalam pekerjaan, jika Anda tertarik saya akan membagikannya juga.
Notabene
Masalah utama dengan resolusi besar adalah bahwa pada akhirnya saya memiliki sekitar 3-4 lampu yang tidak terarah => Saya harus menggunakan peta bayangan kubik di sana, yang menghasilkan 24 shadowmaps. Jika Anda memiliki materi tambahan, saya benar-benar akan menghargai upaya Anda untuk membagikannya kepada saya :-)
Etan
Saya tertarik setidaknya jika itu penting :)
James
1
@Etan. Ya lampu omni directional sangat menyakitkan jika berbicara tentang bayangan. (saya tahu sesuatu tentang hal itu :) gamedev.stackexchange.com/questions/6203/… ). Coba gunakan peta parabola ganda. Atau jika Anda suka cubemaps, cobalah untuk menghemat ruang dengan persimpangan frustum-camera_frustum pemusnahan untuk setiap wajah / render. Anda mungkin tidak akan membutuhkan bayangan untuk semua arah sepanjang waktu (terutama di eksterior)
Notabene
1
@Etan @James Saya menambahkan beberapa hal lagi untuk Anda. Keduanya layak dibaca jika Anda tertarik dengan topik ini.
Notabene