Belleğe sığmayan bir sahneyi nasıl ışınlayabilirim?


11

Raytraced edilecek sahne bellekte saklanamıyorsa, makineye daha fazla RAM eklenmeden, sahnenin farklı bölümlerini piksel başına birkaç kez diskten yükleme ihtiyacı nedeniyle pratik bir zaman aralığında render etmek gerçekçi görünmemektedir. .

Bunun etrafında bir yol var mı? Hafızaya yüklenmesi gereken sayısını azaltmak için, sahnenin belirli bir alt kümesini içeren hesaplamaları çok sayıda gerçekleştirmenin bir yolunu düşünmeye çalışıyorum. Böyle bir durumda hızı artırmanın başka bir yolu var mı?

Yanıtlar:


10

Sahne tamamen belleğe sığmazsa, çekirdek dışı oluşturma alanına girersiniz. Burada esasen iki yaklaşım vardır: a) Talep üzerine sahnenizi oluşturun b) Talep üzerine sahnenizi yükleyin

Eski yaklaşım, modellerin örneğin Catmull-Clark kullanılarak ağır bir şekilde alt bölümlere ayrıldığı ve çok bellek yoğun hale gelebildiği çoğu animasyon iş akışıyla iyi uyum sağlar, ancak taban ağları kendilerini belleğe kolayca sığar. Pixar'ın bununla ilgili birkaç makalesi var (örneğin , Karmaşık Sahnelerdeki Işın İzlemesi için Işın Diferansiyelleri ve Çoklu Çözünürlük Geometrisi Önbelleğe Alma ), ancak özü, modellerin sadece bir ışın tarafından vurulduğunda alt bölümlere ayrılması ve yalnızca olduğu kadar alt bölümlere ayrılmasıdır. böyle bir ışın için makul (örn. dağınık yansıtma ayna yansımalarından daha az doğruluk gerektirir). Geri kalanı, alt bölümlere ayrılmış modelleri bellekte tutan ve umarım süreci iyi bir tahliye stratejisi ile verimli hale getiren bir geometri önbellek tarafından ele alınır.

Tüm taban ağlarınız belleğe rahatça sığdığı sürece, çekirdeğin dışına kolayca çıkıp ağları asla belleğe sığmayan alt bölüm düzeylerinde oluşturabilirsiniz. Geometri önbelleği, sahip olduğunuz bellek miktarıyla da güzelce ölçeklenir ve RAM ile oluşturma sürelerini tartmanıza olanak tanır. Bu da inandığım Otomobillerde kullanıldı .

İkinci yaklaşım daha geneldir ve alt bölümlerin yoğun kullanımına dayanmaz. Bunun yerine, sahnenizin büyük olasılıkla bir sanatçı tarafından yapıldığı ve zaten belleğe ayrı ayrı sığacak şekilde makul küçük nesnelere bölünmüş olduğu gerçeğine dayanır. Buradaki fikir, iki hiyerarşiyi (kD ağacı veya sınırlayıcı hacim hiyerarşisi) tutmaktır: Yalnızca sahnenizdeki nesnelerin sınırlayıcı kutularını depolayan üst düzey bir hiyerarşi ve gerçek geometriyi depolayan düşük düzeyli bir hiyerarşi. Her nesne için böyle bir düşük seviyeli hiyerarşi vardır.

Bu yaklaşımda, ideal olarak diskteki her nesne ile birlikte bir sınırlama kutusu depolamış olursunuz. Sahne yüklenirken, başlangıçta yalnızca üst düzey hiyerarşiyi oluşturursunuz, yani geometriye değil sınırlayıcı kutulara bakmanız gerekir. Daha sonra ışınları izlemeye başlar ve hiyerarşiden geçebilirsiniz. Bir ışın üst düzey hiyerarşideki bir yaprak düğümüne çarptığında (yani bir nesnenin sınırlayıcı kutusuna çarptığında), o nesne belleğe yüklenir ve düşük düzey hiyerarşisi oluşturulur. Işın daha sonra bu nesneyi izlemeye devam eder. Bellekteki düşük düzey hiyerarşisinin çoğunu mümkün olduğunca koruyan bir nesne önbelleği ile birleştiğinde, bu makul bir şekilde iyi performans gösterebilir.

Böyle bir yaklaşımın ilk yararı, asla vurulmayan nesnelerin asla yüklenmemesidir, yani sahnenizdeki görünürlüğe otomatik olarak uyum sağlar. İkinci faydası, çok fazla ışın izliyorsanız, bir nesneyi bir ışın tarafından vurulduğu için hemen yüklemeniz gerekmez; bunun yerine, o ışını tutabilir ve yükü birden fazla ışın vuruşu üzerinden amorti ederek yeterli ışının o nesneye çarpmasını bekleyebilirsiniz.

Bu yaklaşımı, tutarsız ışınlardan kaynaklanan döküntüleri önlemek için Üretim Yolu İzlemesi için Sıralı Ertelenmiş Gölgeleme gibi bir ışın sıralama algoritmasıyla birleştirebilirsiniz . Söz konusu makalede, Big Hero 6 için kullanılan Disney'in Hyperion oluşturucusunun mimarisi anlatılıyor, bu yüzden büyük olasılıkla sahneleri üretim ölçeğinde işleyebilir.


1
Bu çok ilginç! Bağladığınız Disney kağıdı da öyle.
John Calsbeek

+1 Her zaman merak ettiğim şeylere pek çok cevap!
Rotem

7

Sahnenizi uzamsal bir yapıda düzenlerseniz (olağan yol, Sınırlayıcı Hacim Hiyerarşisi olmaktır ), bir tür sanal sahne kullanabilirsiniz (bu terimi sanal dokulara referans olarak yapıyorum ).

Bir bellek yöneticisi bir seferde sadece sınırlı sayıda sınırlayıcı kutu yükler ve bir tane almayı içeren işlemi soyutlardı.

Bu şekilde, bir kutu yalnızca gerektiği gibi yüklenir: bir ışın sınırlayıcı bir kutuya çarptığında, çarpışmayı çözmek için kutu yüklenir. Daha sonra başka bir kutunun yüklenmesi gerektiğinde, kullanılmayan kutu silinir ve yenisine yer açılır.

Tüm bu kutular yüklenip silindiğinde, ışın tutarlılığı hızda önemli bir faktör olacaktır. Önceden yüklenmiş olan kutuları tedavi etmek için ışınları yeniden sıralayarak, yükü ertelemek olabilir.


Evet böyle bir şey.
joojaa

1

Yaptığınız şey, daha önce vurulmuş olanlara dayanarak üçgenleri diskten belleğe yüklemektir. İlk önce yakınlardaki üçgenlerle başlayabilirsiniz. Bunun nedeni, bir alanda ışınların aynı üçgenleri tekrar tekrar vurmasıdır. Ve sonunda biraz verimli olacaksınız. (Bu nedenle, tıkanıklık izlemesinde son isabet üçgenini siparişle ilgilenmeyen önbelleklemek iyi bir fikirdir)

İkincisi, üçgenleri diskte hızlı arama yapmanıza olanak tanıyan, belleğe sahip olduğunuz bölümleri yakınlık bakımından yenilemenizi sağlayan bir uzamsal ağaçta saklarsınız. Bu yüzden sadece ışın yolunda olacak dalları yükleyin. Eğer bir çeşit voksel ağacı, bir oktree gibi, ikincil ışınları bile sıralayabilir ve tutarlılıkla çözebilirsiniz. Bir BSP ağacı da budama alanlarında biraz iyidir.

Bunun başarısız olduğu durumlar var, ancak gürültü yapmazsanız çoğu sahne kovasında makul derecede verimli ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.