Ini mungkin paling mudah dipahami dengan kontras dengan raytracing.
Untuk membuat primitif dengan raytracing, Anda memerlukan fungsi yang, mengingat sinar primitif dan input, memberi tahu Anda dengan tepat di mana sinar itu mengenai primitif. Kemudian Anda dapat menguji ray terhadap semua primitif yang relevan, dan memilih persimpangan terdekat. CPU bagus dalam hal ini.
Dengan raymarching, Anda tidak memiliki fungsi persimpangan sinar yang sederhana. Diberi titik pada sinar, Anda dapat memperkirakan seberapa dekat titik itu ke permukaan, tetapi Anda tidak tahu persis seberapa jauh Anda perlu memperpanjang sinar itu untuk mengenai permukaan.
Jadi, Anda "berbaris" satu langkah pada satu waktu:
Mulai dari "awal" sinar - bidang dekat untuk rendering adegan, atau persimpangan dengan volume pembatas jika hanya satu objek dalam adegan. (P0 pada diagram di bawah)
Evaluasilah fungsi jarak Anda untuk mendapatkan perkiraan seberapa dekat Anda dengan permukaan. (Lingkaran terbesar dalam diagram)
Bergerak maju sepanjang sinar sesuai dengan perkiraan Anda. Langkah ini harus singkat, jadi Anda yakin Anda tidak akan menggali permukaan di mana pun.
Sekarang Anda memiliki poin baru (P1 di bawah) - dapatkan estimasi baru dan ulangi.
Lanjutkan mendapatkan taksiran dan melangkah maju sampai Anda berada dalam jarak ambang batas permukaan, atau Anda mencapai jumlah langkah maksimum. (P4 di bawah)
Sekarang Anda memiliki kedalaman permukaan, dan dapat menyimpulkan hal-hal seperti normals / oklusi ambien dari sampel terdekat, dan menggunakan data ini untuk menerangi & mewarnai piksel.
Contoh diagram dari GPU Permata 2, bab 8
Karena setiap ray bersifat independen dan hanya menggunakan (biasanya) informasi lokal di setiap langkah, ia siap untuk diparalelkan pada GPU. Seringkali, hanya dua segitiga yang akan digambar di layar. Setelah rasterisasi ini, setiap piksel dilewatkan ke shader fragmen mewakili satu sinar. Shader fragmen memandu sinar itu hingga mencapai permukaan, mengembalikan hasilnya (seringkali hanya nilai kedalaman untuk tekstur & bayangan dalam lintasan layar penuh terpisah).
Langkah-langkah yang tepat sangat tergantung pada efek tertentu yang ingin Anda capai. Teknik raymarching digunakan dengan ...
- bidang ketinggian untuk mensimulasikan perpindahan permukaan pada geometri raster tradisional (pemetaan oklusi paralaks)
- scene depth buffer untuk hal-hal seperti pantulan pantulan
- tekstur volume untuk memvisualisasikan kumpulan data sampel 3D (seringkali ilmiah / medis)
- fungsi implisit untuk merender hal-hal seperti fraktal
- bidang jarak prosedural seperti dalam pekerjaan Iñigo Quilez (tautan bagus dari msell dalam komentar di atas).
Raymarching juga digunakan dengan memadukan pada setiap langkah (sering menggunakan langkah-langkah tetap alih-alih memperkirakan jarak setiap kali) untuk memberikan transparansi volumetrik, seperti dalam contoh ini dari Wikipedia .
Ini telah menjadi cara populer untuk membuat awan terperinci secara realtime .
Bahkan Pemetaan Interior , cara mensimulasikan detail ruang interior di balik jendela bangunan, dapat dianggap sebagai bentuk raymarching, di mana sinar tersebut melangkah dari titik memasuki jendela ke dinding terdekat, lantai / langit-langit, atau pesawat furnitur.
Jika ada jenis efek raymarching khusus yang Anda minati, Anda mungkin bisa mendapatkan jawaban yang lebih terperinci dengan mengajukan pertanyaan baru dengan contoh spesifik. Sebagai sebuah keluarga, teknik ini terlalu beragam untuk mencakup semuanya dalam satu jawaban singkat. ;) Saya harap ini memberi Anda kerangka kerja untuk memahami apa yang terjadi di bawah tenda di shader ini.