Saat ini saya sedang mengembangkan mesin gim yang menggunakan bidang jarak yang ditandatangani sebagai teknik render untuk menampilkan geometri prosedural yang lancar (dihasilkan dengan primitif sederhana seperti yang ada di tautan Anda untuk saat ini, mencari untuk mengimplementasikan fraktal Julia dan IFS di masa mendatang). Karena mesin saya difokuskan pada generasi prosedural dan harus mendefinisikan angka dengan cara yang membuat mereka ramah sinar, saya kira saya berada di tempat yang baik untuk menjawab pertanyaan ini: P.
Mengenai streaming, solusi sederhana adalah dengan menggunakan semacam buffer yang diketikkan dan melemparkannya ke GPU ketika Anda ingin melakukan ray-marching Anda. Setiap elemen buffer adalah tipe kompleks (mis. Struct dalam C / C ++), dan setiap tipe berisi elemen yang mendefinisikan fungsi apa yang harus Anda gunakan untuk merepresentasikannya, posisinya, rotasi, skala, dll, dan warna rata-rata. Proses kemudian disederhanakan menjadi:
- Cull adegan Anda menjadi subset dikelola (perhatikan bahwa culling frustum dan oklusi culling sebagian dilakukan secara otomatis oleh algoritma ray-marching)
- Masukkan subset ke buffer input render Anda
- Lewati buffer ke GPU jika belum ada di sana, lalu render adegan Anda dengan marching ray tradisional biasa. Anda akan perlu melakukan semacam pencarian per langkah untuk mengevaluasi item mana dalam buffer input yang paling dekat dengan setiap ray untuk setiap iterasi dari march-ray, dan Anda harus menerapkan transformasi ke salah satu sinar (dalam hal ini Anda harus membalik angka rotasi sebelum mencapai GPU) atau fungsi jarak itu sendiri (memindahkan asal fungsi untuk perubahan posisi, menyesuaikan misalnya panjang sisi kubik untuk perubahan skala, dll.) Pendekatan paling sederhana adalah dengan hanya memodifikasi sinar sebelum Anda meneruskannya ke fungsi jarak inti aktual.
Mengenai warna figur, ingatlah bahwa shader memungkinkan Anda untuk mendefinisikan tipe kompleks dan primitif;). Itu memungkinkan Anda untuk melemparkan semuanya ke dalam struct gaya-C, kemudian meneruskannya kembali dari fungsi jarak Anda.
Di mesin saya, setiap struct berisi jarak, warna, dan ID yang mengikatnya ke definisi gambar yang sesuai di buffer input. Setiap ID disimpulkan dari konteks sekitarnya dari fungsi jarak yang relevan (karena fungsi pemetaan saya loop melalui buffer input untuk menemukan angka terdekat dengan setiap sinar untuk setiap langkah, saya dapat dengan aman memperlakukan nilai penghitung loop ketika setiap SDF dipanggil sebagai ID gambar untuk fungsi itu), sedangkan nilai jarak didefinisikan menggunakan SDF inti sewenang-wenang (mispoint - figure.pos
untuk sebuah bola), dan warna dapat didefinisikan dari warna rata-rata elemen yang sesuai dalam buffer angka (oleh karena itu mengapa berguna untuk menjaga ID gambar tetap ada) atau melalui warna prosedural yang tertimbang menuju rata-rata yang disimpan (salah satu contoh mungkin mengambil hitungan iterasi untuk beberapa titik pada Mandelbulb, memetakan "warna rata-rata" Anda dari ruang warna FP ke ruang warna bilangan bulat, lalu menggunakan warna yang dipetakan sebagai palet dengan XOR'ing terhadap jumlah iterasi).
Tekstur prosedural adalah pendekatan lain, tetapi saya tidak pernah menggunakannya sendiri. iq telah melakukan banyak penelitian di bidang itu dan memposting beberapa demonstrasi menarik di Shadertoy, sehingga bisa menjadi salah satu cara untuk mengumpulkan beberapa informasi tambahan.
Terlepas dari apakah warna Anda statis untuk setiap angka, yang dihasilkan secara prosedural, atau ajaib sampel dari tekstur prosedural, logika dasar adalah sama: angka Abstrak menjadi semacam jenis kompleks menengah (misalnya struct), menyimpan baik jarak lokal dan lokal warna dalam instance dari tipe itu, kemudian lulus tipe kompleks sebagai nilai balik dari fungsi jarak Anda. Bergantung pada implementasi Anda, warna output kemudian dapat melewati langsung ke layar, atau mengikuti titik tumbukan ke kode pencahayaan Anda.
Saya tidak tahu apakah hal di atas cukup jelas atau tidak, jadi jangan khawatir menanyakan apakah ada yang tidak masuk akal. Saya tidak bisa benar-benar memberikan sampel kode GLSL / pixel-shading karena saya bekerja dengan HLSL dan menghitung shading, tapi saya senang mencoba dan membahas apa pun yang saya tidak tulis dengan benar sejak awal :).