İmzalı Mesafe Alanı Ray Yürüyüşü dinamik bir dünya için nasıl uygulanır?


10

Sanırım İşaretli Mesafe Alanı Ray Marching'in temellerini anlıyorum. Sahnenizi bir grup mesafe alanıyla modelleyin (örneğin: http://iquilezles.org/www/articles/distfunctions/distfunctions.htm ), daha sonra bir ışın yayınladığınız her piksel için ışının başından başlayın , o noktada en yakın nesneye olan mesafeyi bulun ve bir şeye çarpana kadar noktayı en yakın mesafeye kadar artırın. Basit bir oluşturucu yapmayı başardım ve tekniğin çoğu tanımının durduğu yer burası.

Bu bana SDF Ray Marching'in gerçek dünya senaryosunda nasıl kullanılabileceğine dair bazı sorular bırakıyor:

Soru 1: Gerçek bir oyunda, sahne genellikle karmaşıktır ve CPU'ya birçok dinamik nesne ile yüklenir. Temel oklüzyon ayıklamayı (oktrees gibi) anlıyorum ve çokgen oluşturma ile, görüntüleme hayal kırıklığındaki öğelerin bir listesini (CPU'da) oluşturacaktım.

Yani, ekranda hareket eden, CPU tarafından kontrol edilen birçok karakter ve dinamik nesnenin olduğu çok karmaşık bir sahnem olduğunu hayal edin. Oluşturmak istediğim nesneleri GPU'ya her karede nasıl akıtırım? Her örnekte sahne GLSL'de kodlanmıştır. Birisi gölgelendiriciye akışla aktarılan düzeyin bir örneğini dinamik olarak paylaşabilir mi?

Soru 2: Nesnelerin nasıl birden fazla rengi olabilir? Mesafe işlevleri yalnızca bir mesafe döndürür, ancak uygulamalar genellikle rengi nasıl geri gönderir? (örneğin mavi bir küreye değil kırmızı bir küreye çarptısınız.) Bu bir CPU uygulaması olsaydı, ışın yürüyüşçüsünü sonlandırmak için bir isabet olduğunda mesafe işlevinin içinde küresel bir işlev çağırabilirim ve bu da isabet nesnesinin doku / renk. Ancak, öğenin rengini veya dokusunu GLSL'de nasıl iade edersiniz?

Teşekkür ederim.

Yanıtlar:


2

Bu asgari bir cevaptır, ancak daha iyi bir cevap alamamanız durumunda bilgileri paylaşmak istedim.

Gerçek oyunların ışın yürüyüşünü nasıl kullandığına gelince, genellikle kullanmazlar. Sadece son birkaç yıl içinde oyunlar ekran alanı yansımaları yapmak için derinlik tamponunu ışınlamaya başladı, ancak hiçbir oyun ışın yürüyüşünü tanımladığınız şekilde kullandığını bilmiyorum - henüz?

Renkler ve benzerleri hakkındaki diğer soru için, insanlar genellikle nesneleri nesnelerle ilişkilendirir ve ışının nesneye o noktadaki malzeme özelliklerini bulmak için ışının nesneye çarptığı noktanın "doku koordinatlarını" kullanır. Yaygın malzemeler arasında dağınık renk, aynasal yoğunluk, yayıcı renk ve şeffaflık / kırılma indisi bulunur.

Umarım bu sizin için en azından biraz yardımcı olur! Grafik yığını değişim sitesinden de iyi yanıtlar alabilirsiniz.


2
"Molekül'ün yaklaşmakta olan oyunu Dreams, kullanıcı tarafından oluşturulan içerik şekillendirmesi için imzalı mesafe alanlarını kullanıyor, ancak doğru bir şekilde anlarsam, alanlar yerine görüntüleme için bir nokta bulutuna dönüştürülür. doğrudan ışınlanmış. Bu makalede bazı fikirler olabilir: dualshockers.com/2015/08/15/…
DMGregory

1
@DMGregory Güzel, ama bence bu kesinlikle Ray Marching değil. Bu yüzden nokta hala geçerli, oyunlar genellikle ışın yürüyüşü kullanmıyor.
concept3d

1
Bu iş parçacığının güncellenmesi - yaklaşan oyun Claybook'un, sahnelerini , önce geleneksel geometriye dönüştürmek yerine, doğrudan mesafe alanlarından ateşlenen ışınları kullanarak oluşturduğu bildiriliyor . Peki "henüz?" iki yıl sonra ortaya çıktı. :)
DMGregory

1

Şu anda pürüzsüz prosedürel geometriyi görüntülemek için imzalı mesafe alanlarını kullanan bir oyun motoru geliştiriyorum (şu anda bağlantınızdakiler gibi basit ilkellerle oluşturulmuş, gelecekte Julia ve IFS fraktallarını uygulamak istiyor). Motorum prosedürel üretime odaklandığından ve rakamları ray-marcher'ı kolaylaştıracak şekilde tanımlaması gerektiğinden , bu soruyu cevaplamak için iyi bir yerdeyim.

Akışla ilgili olarak, basit çözüm, bir tür yazılan bir tampon kullanmak ve ışın yürüyüşü yapmak istediğinizde GPU'ya atmaktır. Tamponun her elemanı karmaşık bir tiptir (örn. C / C ++ 'da bir yapı) ve her tür, onu temsil etmek için hangi işlevi kullanmanız gerektiğini, konumunu, dönüşünü, ölçeğini, vb. Ve ortalama bir rengi tanımlayan öğeler içerir. İşlem daha sonra aşağıdakileri basitleştirir:

  1. Sahnenizi yönetilebilir bir alt kümeye itin (frustum ayıklama ve oklüzyon ayıklamanın kısmen de olsa ışınlama algoritması tarafından otomatik olarak yapıldığını unutmayın)
  2. Alt kümeyi oluşturma giriş arabelleğinize geçirin
  3. Tamponu henüz yoksa GPU'ya geçirin, ardından sahnenizi sıradan geleneksel ışın yürüyüşüyle ​​render edin. Ray-marcher'ın her yinelemesi için giriş arabelleğindeki hangi öğenin her ışına en yakın olduğunu değerlendirmek için bir tür adım başına arama yapmanız gerekir ve ışınlardan birine dönüşümler uygulamanız gerekir (bu durumda GPU'ya ulaşmadan önce şekil dönüşlerini ters çevirmeniz gerekir) veya mesafe işlevleri kendileri (konum değişiklikleri için işlev başlangıç ​​noktasını hareket ettirme, örneğin ölçek değişiklikleri için kübik yan uzunlukları ayarlama, vb.) En basit yaklaşım, daha önce ışınları değiştirmektir. bunları gerçek çekirdek mesafe işlevine iletirsiniz.

Şekil renkleriyle ilgili olarak, gölgelendiricilerin ilkellerin yanı sıra karmaşık türleri tanımlamanıza izin verdiğini unutmayın;). Bu, her şeyi C stili bir yapıya atmanıza, ardından bu yapıları mesafe işlevinizden geri aktarmanıza olanak tanır.

Motorumda, her yapı bir mesafe, renk ve onu giriş arabelleğindeki karşılık gelen şekil tanımına bağlayan bir kimlik içerir. Her kimlik, ilgili mesafe fonksiyonunun çevre bağlamından çıkarılır (eşleme fonksiyonum, her adım için her ışına en yakın rakamı bulmak için giriş arabelleğinden geçtiği için, her bir SDF çağrıldığında döngü sayacının değerini güvenli bir şekilde tedavi edebilirim mesafe değerleri rasgele bir çekirdek SDF kullanılarak tanımlanırken (ör.point - figure.pos bir küre için) ve renkler ya şekil arabelleğindeki uygun öğenin ortalama renginden (bu nedenle şekil kimliğini çevresinde tutmak yararlıdır) veya depolanan ortalamaya doğru ağırlıklı bir prosedür rengi aracılığıyla tanımlanır (bir örnek alıyor olabilir Mandelbulb üzerinde bir nokta için bir yineleme sayımı, "ortalama renginizi" FP renk uzayından tamsayı renk uzayına eşleme, ardından eşlenen rengi yineleme sayısına göre XOR'lama yoluyla bir palet olarak kullanma).

Prosedürel dokular başka bir yaklaşımdır, ancak onları asla kendim kullanmadım. iq bu alanda oldukça fazla araştırma yaptı ve Shadertoy hakkında bazı ilginç gösteriler yayınladı, bu yüzden ekstra bilgi toplamanın bir yolu olabilir.

Ne olursa olsun bir renk, her şekil, prosedür üretilen veya sihirli usul doku örneklenmiş statik olup olmadığı, temel mantık aynıdır: orta kompleks tipte bir tür (örneğin, bir yapı) içine Özet rakamlar, depolamak hem yerel mesafe ve yerel bu tür bir örnekte renk ekleyin, ardından karmaşık türü uzaklık işlevinizden bir dönüş değeri olarak iletin. Uygulamanıza bağlı olarak, çıktı rengi doğrudan ekrana geçebilir veya çarpışma noktasını aydınlatma kodunuza kadar takip edebilir.

Yukarıdakilerin yeterince açık olup olmadığını bilmiyorum, bu yüzden bir şeyin mantıklı olmadığını sormak için endişelenmeyin. HLSL ve hesaplama gölgelendirme ile çalıştığım için gerçekten herhangi bir GLSL / piksel gölgeleme kodu örneği veremiyorum, ancak ilk etapta düzgün bir şekilde yazmadığım bir şeyi denemekten mutluluk duyuyorum :).

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.