Jika adegan tidak sepenuhnya sesuai dengan memori, Anda memasuki bidang rendering out-of-core. Pada dasarnya ada dua pendekatan di sini: a) Hasilkan adegan Anda sesuai permintaan b) Muat adegan Anda sesuai permintaan
Pendekatan sebelumnya selaras dengan sebagian besar alur kerja animasi, di mana model sangat terbagi menggunakan misalnya Catmull-Clark dan dapat menjadi sangat intensif memori, tetapi basis meshes sendiri dengan mudah masuk ke dalam memori. Pixar memiliki beberapa makalah tentang ini (misalnya Ray Differentials dan Multiresolution Caching Geometry untuk Distribusi Ray Tracing dalam Scene Kompleks ), tetapi intinya adalah bahwa model hanya dibagi lagi ketika mereka terkena sinar, dan hanya dibagi lagi sebanyak masuk akal untuk sinar seperti itu (misalnya interrefleksi difus membutuhkan akurasi kurang dari refleksi cermin). Selebihnya ditangani oleh cache geometri, yang menjaga model terbagi dalam memori dan mudah-mudahan membuat proses ini efisien dengan strategi pengusiran yang baik.
Selama semua mesh dasar Anda dengan nyaman masuk ke dalam memori, Anda dapat dengan mudah keluar dari core dan membuat mesh pada tingkat subdivisi yang tidak akan pernah masuk ke dalam memori. Cache geometri juga diskalakan dengan baik dengan jumlah memori yang Anda miliki, memungkinkan Anda untuk menimbang RAM vs waktu render. Ini juga digunakan di Mobil saya percaya.
Pendekatan kedua lebih umum dan tidak bergantung pada penggunaan subdivisi yang berat. Sebaliknya, itu bergantung pada kenyataan bahwa adegan Anda kemungkinan besar dibuat oleh seorang seniman dan sudah dipartisi menjadi objek yang cukup kecil yang masuk ke memori secara individual. Idenya adalah untuk mempertahankan dua hierarki (kD-tree atau hierarki volume terikat): Hirarki tingkat atas yang hanya menyimpan kotak pembatas objek dalam adegan Anda, dan hierarki tingkat rendah yang menyimpan geometri aktual. Ada satu hierarki tingkat rendah untuk setiap objek.
Dalam pendekatan ini, Anda idealnya sudah menyimpan kotak pembatas bersama dengan setiap objek pada disk. Saat adegan dimuat, Anda hanya membangun hierarki tingkat atas pada awalnya, artinya Anda hanya perlu melihat kotak pembatas dan bukan geometri. Anda kemudian mulai melacak sinar dan melintasi mereka melalui hierarki. Kapan saja sinar menyentuh simpul daun di hierarki tingkat atas (yaitu menyentuh kotak pembatas suatu objek), objek tersebut dimuat ke dalam memori dan hierarki tingkat rendahnya dibangun. Sinar kemudian terus turun ke melacak objek itu. Dikombinasikan dengan cache objek yang menyimpan sebanyak mungkin hierarki level rendah dalam memori, ini dapat berkinerja cukup baik.
Manfaat pertama dari pendekatan semacam itu adalah bahwa objek yang tidak pernah mengenai tidak pernah dimuat, yang berarti bahwa secara otomatis beradaptasi dengan visibilitas dalam adegan Anda. Manfaat kedua adalah bahwa jika Anda melacak banyak sinar, Anda tidak harus segera memuat objek karena terkena sinar; sebagai gantinya, Anda dapat menahan sinar itu dan menunggu sampai cukup banyak sinar mengenai objek itu, mengamortisasi beban melalui beberapa serangan sinar.
Anda juga dapat menggabungkan pendekatan ini dengan algoritma pengurutan sinar seperti Pengurutan Penangguhan yang Ditangguhkan untuk Pelacakan Jalur Produksi untuk menghindari benturan karena sinar yang tidak jelas. Makalah yang disebutkan menggambarkan arsitektur penyaji Hyperion Disney, digunakan untuk Big Hero 6 saya percaya, sehingga kemungkinan besar dapat menangani adegan pada skala produksi.
Jika Anda mengatur adegan Anda dalam struktur spasial (cara yang biasa menjadi Bounding Volume Hierarchy ), Anda dapat menggunakan semacam adegan virtual (saya membuat istilah ini, mengacu pada tekstur virtual ).
Seorang manajer memori akan menyimpan hanya sejumlah terbatas kotak terikat dimuat pada satu waktu, dan abstrak operasi yang terdiri dari pengambilan satu.
Dengan cara ini, sebuah kotak hanya akan dimuat sesuai kebutuhan: ketika sebuah sinar menyentuh kotak yang membatasi, kotak tersebut akan dimuat untuk menyelesaikan tabrakan. Kemudian ketika kotak lain perlu dimuat, yang tidak digunakan dihapus untuk memberi ruang bagi yang baru.
Dengan semua kotak ini dimuat dan dihapus, koherensi sinar akan menjadi faktor utama dalam kecepatan. Saya kira perbaikan lebih lanjut bisa menunda pengiriman, dengan memesan kembali sinar untuk memperlakukan kotak yang sudah dimuat terlebih dahulu.
sumber
Apa yang Anda lakukan adalah Anda memuat segitiga ke dalam memori dari disk berdasarkan apa yang telah dipukul sebelumnya. Anda bisa mulai dengan segitiga di dekat terlebih dahulu. Alasannya adalah bahwa di satu daerah sinar cenderung mengenai segitiga yang sama berulang kali. Dan pada akhirnya Anda akan menjadi agak efisien. (Untuk alasan ini adalah ide yang bagus untuk men-cache segitiga hit terakhir di penelusuran oklusi yang tidak peduli pesanan)
Kedua, Anda menyimpan segitiga di pohon spasial yang memungkinkan Anda melakukan pencarian cepat dari disk, untuk memperbarui bagian apa yang Anda miliki dalam memori dengan kedekatan. Jadi hanya memuat cabang yang akan menghalangi sinar. Jika itu semacam pohon voxel, seperti sebuah octree Anda bahkan dapat mengurutkan sinar sekunder dan menyelesaikannya dengan koherensi. Pohon BSP juga cukup baik dalam hal pemangkasan.
Ada kasus-kasus di mana ini gagal tetapi cukup efisien di sebagian besar scene bucket jika kebisingan rendering Anda ...
sumber