Bagaimana cara kerja Raymarch shaders?


49

Saya telah melihat shader yang ditemukan di sini shadertoy.com dan sebagian besar yang keren memiliki noise dan raymarch yang sama. Saya tidak mengerti kode sumber sama sekali tapi saya benar-benar ingin. Bagaimana cara shader ini bekerja dan bagaimana cara kerja algoritma raymarch? Saya telah mencari di seluruh dan tidak dapat menemukan apa pun pada topik.

Terima kasih


6
Iñigo Quilez telah menulis tutorial yang sangat baik tentang hal itu. Lihat iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm dan iquilezles.org/www/articles/distfunctions/distfunctions.htm . Shader keren ini bukan sembarang raymarching, tetapi secara khusus bidang jarak raymarching, juga disebut sphere tracing.
msell

Apakah Anda bertanya tentang pawai ray secara umum atau pawai ray pada GPU?
concept3d

@Milo Bisakah Anda mengklarifikasi pertanyaan Anda? Apakah Anda bertanya bagaimana algoritma ini digunakan untuk menghasilkan gambar yang Anda lihat di demo keren? Apakah Anda bertanya bagaimana cara kerja pawai ray? Apakah Anda bertanya bagaimana pawai ray di fragmen / pixel shader (yaitu implementasi yang efisien) bekerja?
TravisG

Saya menerapkan Raymarching di Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Jawaban:


78

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:

  1. 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)

  2. Evaluasilah fungsi jarak Anda untuk mendapatkan perkiraan seberapa dekat Anda dengan permukaan. (Lingkaran terbesar dalam diagram)

  3. Bergerak maju sepanjang sinar sesuai dengan perkiraan Anda. Langkah ini harus singkat, jadi Anda yakin Anda tidak akan menggali permukaan di mana pun.

  4. Sekarang Anda memiliki poin baru (P1 di bawah) - dapatkan estimasi baru dan ulangi.

  5. Lanjutkan mendapatkan taksiran dan melangkah maju sampai Anda berada dalam jarak ambang batas permukaan, atau Anda mencapai jumlah langkah maksimum. (P4 di bawah)

  6. 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.

Mengarahkan sinar dari P0 ke persimpangannya

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 .

Raymarching tekstur volume tembus

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.