Apa algoritma terkini untuk bidang ketinggian ray-tracing?

16

Ada banyak makalah selama bertahun-tahun tentang teknik yang berbeda untuk menggambar medan bidang tinggi dalam pelacak sinar. Beberapa algoritma ray-pawai grid secara langsung (atau melalui quadtree); yang lain mengubah medan menjadi jaring poligon dan menggunakan uji persimpangan ray-triangle standar. Penelitian tampaknya telah bergerak dalam beberapa tahun terakhir, dan sulit untuk menemukan makalah yang ditulis dalam dekade terakhir, tetapi keseimbangan antara memori dan komputasi (baik CPU dan GPU) masih berubah.

Algoritma seperti apa yang memberikan kinerja terbaik pada mesin desktop kelas atas saat ini? Atau jika tidak ada jawaban tunggal, bagaimana perbedaan karakteristik kinerja dari algoritma terbaik saat ini?

Dan Hulme
sumber
Refleksi layar-ruang: buat bidang ketinggian menggunakan penyangga kedalaman dan bingkai, lacak jejaknya untuk mendapatkan pantulan kasar. Saya tidak tahu detailnya, tapi saya bayangkan Crysis, Killzone, Frostbite, dll. Akan menggunakan beberapa teknik canggih untuk mempercepatnya. Sudahkah Anda melihat ini?
David Kuri
1
@ Davidviduri Terima kasih, itu adalah penunjuk yang bagus untuk bagaimana mendapatkan core-marching cepat. Seharusnya ada banyak optimasi yang dimungkinkan untuk bidang ketinggian yang lebih statis yang tidak berfungsi dengan baik pada penelusuran layar-ruang, seperti pemetaan pra-komputasi atau min-max quadtree, jadi saya masih berharap jawaban itu mencakup itu.
Dan Hulme
Hai Dan BTW apakah Anda mencari solusi CPU atau GPU? Dan rendering real time atau non real time?
Alan Wolfe
@AlanWolfe Penggunaan saya adalah GPU dan non-real-time (yaitu throughput maks daripada kualitas gambar terbaik yang dapat Anda kelola dalam 16 ms), tetapi saya akan tetap mengunggah jawaban menarik yang cepat pada CPU atau terutama untuk penyaji interaktif.
Dan Hulme
Anda bisa mencoba membuat bidang jarak yang ditandatangani dari peta ketinggian. Itu pada dasarnya tekstur 3d yang menyimpan jarak ke permukaan berikutnya. Ini memungkinkan untuk "melakukan perjalanan sinar lebih cepat". Unreal Engine 4 menggunakan ini untuk oklusi ambien kisaran menengah, bayangan lembut, dan bayangan medan pada umumnya
user1888

Jawaban:

12

Untuk keadaan saat ini, lihat makalah ini: "Mipmaps Maksimum untuk Rendering Bidang Ketinggian Dinamis Cepat, Akurat, dan Terukur", Tevs et al. 2008

Ide dasarnya adalah untuk melewati banyak ruang dengan memiliki pengetahuan tentang nilai maksimum di wilayah yang luas. Jika sinar tetap di atas itu, lewati ke area besar berikutnya.

Jika Anda melihat Gambar 8, Anda akan melihat perbandingan stepping linier dasar vs mipmaps maksimum. Stepping linear menghasilkan 200 langkah, yang dapat dilakukan secara real-time pada GPU modern tetapi sebenarnya masih lambat. Max mipmaps melakukan hal yang sama dalam sekitar 10 langkah, semuanya dalam shader.

Rama
sumber
Saya menerima jawaban ini karena makalah itu sendiri bagus dan bagian "Pekerjaan terkait" tampaknya cukup komprehensif. Bahkan jika saya tidak menggunakan teknik ini dengan tepat, saya yakin saya akan dapat menyesuaikan sesuatu untuk kasus penggunaan saya dari ini dan referensi.
Dan Hulme
Sudahkah Anda menemukan demo dengan mipmaps maksimum? Terima kasih.
raRaRa
Saya belum membaca makalahnya, tetapi "pemetaan maksimum" ini terdengar sangat mirip dengan teknik yang digunakan untuk Pemetaan Langkah Kerucut (yang meningkatkan pemetaan oklusi parallax dengan melewatkan area yang luas berkat kerucut).
Julien Guertault
@ JulienGuertault Saya akan mengatakan ini adalah penelusuran HiZ biasa. itu adalah metode yang aman untuk memastikan apa yang Anda tekan. Tetapi tidak terlalu cepat dibandingkan dengan metode yang tidak aman seperti pencarian biner.
v.oddou
4

Yang terbaik yang saya pribadi lihat adalah barang-barang inigo quillez tidak, yang digunakan dalam barang-barang demoscene. Ray March medan, mengambil langkah-langkah yang lebih besar semakin jauh Anda dapatkan dari kamera karena detail (biasanya) kurang penting di kejauhan (pengecualian = dinding tipis!). Dia menggunakan info penetrasi dan metrik lain yang mudah didapat untuk mensimulasikan oklusi ambien dan teknik pencahayaan canggih lainnya.

Berikut ini adalah demo dari barang yang sedang beraksi: https://www.youtube.com/watch?v=_YWMGuh15nE

Dan inilah halaman IQ tentang raymarching medan yang merupakan bacaan yang cukup menarik: http://www.iquilezles.org/www/articles/terrainmarching/terrainmarching.htm

BTW, dalam permainan modern, teknik "refleksi ruang layar" sering hanya pawai sinar terhadap Z buffer dari adegan yang diberikan. Z buffer benar-benar hanya bidang ketinggian.

Saya melihat beberapa pembicaraan tentang hal ini di siggraph 2014, dan sementara beberapa orang menggunakan teknik yang sama seperti IQ, beberapa melakukan hal-hal yang bahkan tidak sebaik IQ, yang menarik untuk dilihat: P

Alan Wolfe
sumber
1
Algoritma di tautan Anda sangat sederhana. Itu terlihat kurang canggih daripada beberapa kertas yang saya temukan dari tahun sembilan puluhan. Sepertinya ini adalah titik awal yang baik, tapi saya berharap untuk solusi berkinerja tinggi untuk sistem produksi, bukan hanya "raytracer pertama saya".
Dan Hulme
Barang-barang ini digunakan dalam kode demoscene dan refleksi ruang layar di game modern paling canggih. Kode tercepat terkadang paling sederhana. Saya tidak akan mengabaikannya karena kesederhanaannya. Akan menarik untuk melihat apakah Anda mendapatkan respons lain.
Alan Wolfe
2
Apa yang hilang dalam respons Anda adalah bahwa IQ menggunakan jaring bidang ketinggian standar sebagai tebakan awal untuk memulai raymarching medan yang sebenarnya. Pertama-tama ia membuat versi dataran rendah-poli menggunakan rasterisasi standar, dan kemudian menjalankan shader piksel di atas gambar yang memulai raymarching pada kedalaman rasterisasi dikurangi beberapa ambang batas konservatif. Ini adalah satu-satunya cara untuk membuat ini menjadi realtime.
Benedikt Bitterli
Saya percaya bahwa hanya sebagian dari apa yang Anda katakan itu benar. dia memang menggunakan heuristik berdasarkan ketinggian medan (bersama jarak dari kamera) untuk mengetahui sejauh mana sinar dapat bergerak, tetapi sejauh yang saya dengar, dia tidak menggunakan rasterisasi. Berikut adalah contoh karyanya, yang tidak menggunakan rasterisasi, tetapi itu tidak berarti bahwa tidak ada implementasi yang DO menggunakan rasterisasi: shadertoy.com/view/MdX3Rr
Alan Wolfe
Saya agak bingung bahwa pertanyaannya adalah tentang penelusuran sinar, dan jawaban ini adalah tentang gerak maju. Ada perbedaan mendasar antara keduanya dan apa yang bisa mereka capai.
Julien Guertault