Neden bazı oyunlar ışıkların duvarlardan parladığını gösteriyor?


28

Bazı oyunlarda, video kalitesini yüksek seviyelere ayarlasam bile duvarların arasında ışıkların parladığını görüyorum.

Son oynadığım oyunlardan birkaçı Borderlands 2 (füze patlamaları) ve Call of Cthulhu (fenerler; oyun Unreal Engine 4'ü kullanıyor).

Bu bir hata mı yoksa performans sebepleri var mı?

Örnek Sınır Alanları 2: https://youtu.be/9bV83qA6_mU?t=419 (birkaç kez, ancak hızlı bir şekilde)

Bonus soru: İkinci durumda, problemi çözmek için ışın izlemenin ucuz bir şekilde kullanılması mümkün mü? Sanırım bu pahalı RT kesinlikle sorunu çözdü, fakat bu sorunu çözmek için "ucuz" bir biçimde de kullanılıp kullanılamayacağını merak ediyorum.


21
Bir resim 1000 kelimeye bedeldir.
Evorlor

8
Test etmek için oyuna gitmeliydim, ama aslında sızan ışık mı , yoksa parlayan bir parçacık etkisi olabilir mi? Özellikle de bir füze patlaması örneğinizde, çarpışmaları görmezden gelmesi muhtemel olan ilave bir "ateş" parçacık efekti hayal edebiliyorum. Fenerler de gözle görülür bir hale getirmek için aynı şeyi yapabilir, sanırım ...
AC

@Evorlor bir örnek ekledi.
Marcus

Yanıtlar:


43

TomTsagk'ın doğru cevabını genişleterek, oyunların neden bu şekilde çalıştığı hakkında biraz daha bilgi vermenin yardımcı olabileceğini düşündüm.

Oyunlardaki ışık, kaynaktan, yüzeye, kameraya, yol boyunca tıkanmaktan gerçekten "seyahat etmiyor".

Belirli bir ışığa dayalı olarak bir yüzeyin her pikselinin ne kadar parlak çizileceğini bulmak için, yüzeyin yüzey yönünü ve yüzeydeki bu noktadan ışık kaynağına yönünü kullanan bir matematik formülü kullanırız (veya yaklaşık olarak). İşte bu, sadece parladığı yön - ışığın gerçekten bu piksele ulaşıp ulaşmadığını kontrol etmek için bir ışın atmıyoruz çünkü ekrandaki her piksel için bunu yapıyor ve ışını sahnedeki tüm ayrıntılı geometriye göre kontrol ediyor. Genellikle gerçek zamanlı oyunlar için hala çok pahalı.

Bu nedenle, varsayılan olarak, hiçbir oyun ışığı gölgede bırakmaz. Işığın yönü, gölgesinde bir gölge atışı olsa bile aynı kalır, böylece matematik bize aynı parlaklık değerini verir.

Gölgeleri simüle etmek istiyorsak, bunu ayrı ayrı yapmalıyız. Ortak yollardan biri, Gölge Haritası denilen şeydir. Bu versiyonda, sahneyi gölgelendirmeden önce sahneyi her ışığın perspektifinden yapıyoruz, sanki bir kameramış gibi görüyoruz, gördüğü her pikselin derinliğini ekran dışı bir dokuda saklıyoruz.

Daha sonra sahneyi gölgelediğimizde, bu pikselin ışık mesafesinden matematiksel mesafesini, gölge haritasındaki karşılık gelen pikselde kaydettiğimiz derinliğe göre karşılaştırabiliriz. Gölge eşlemi derinliği daha küçükse, o zaman buradaki ve ışık arasında başka bir yüzey olduğu anlamına gelir ve biz bu pikseli gölgeye çizeriz.

Bu harita tabanlı gölgelerin daha az yapay ve diğer adlandırmalarla daha güzel görünmesini sağlamak için pek çok harika teknik var, ama şimdilik onları parlaklayacağım. Söylemek yeterli, onlar da genellikle özgür değil.

Çünkü bu, tüm sahnenin her ışığın perspektifinden tekrarlanmasını (en fazla) gerektirir - eğer her yöne doğru parlayan bir nokta ışık ise altı kata kadar (kuzey, güney, doğu, batı, yukarı, aşağı) ve yeniden yapmamız gerekir. -Bir şey hareket edince gölge haritayı verir, bu çok pahalı olabilir.

Bu yüzden, oyunlar genellikle iyi bir gölgeye sahip olmalarını sağlamak için render bütçelerini sahnedeki en önemli ışıklara - yönelimli güneş ışığı gibi - odaklayacaktır. Bir patlama patlaması gibi küçük, kısa ömürlü, minik ışıklar, tıkayıcıları biraz geçtikten sonra çoğu zaman affedilir. Genellikle bu, tüm ekstra gölge harita oluşturma ve hesaplama işlemlerinden elde edilen maliyet artışındaki ani bir artış nedeniyle kare hızındaki bir aksaklıktan daha fazla zevklidir. Özellikle akıcılığın piksel kusursuzluğundan daha önemli olduğu yoğun bir aksiyon sahnesiyse.


3
Bir başka kırışıklık, bir ışık kaynağının bir yüzeyin önünde mi yoksa arkasında mı olduğunu tespit etmenin önemsiz olmasına rağmen, arkadan aydınlatıldığında yüzeylerin parlamasını önlemek genellikle tuhaf görünümlü sonuçlar verir.
supercat

Ve bu özellikle partikül etkileri için de geçerlidir (patlama muhtemelen en azından kısmendir), çünkü partiküllerin çok kullanışlı olması için özellikle ucuz olması gerekir.
Luaan

2
Işıklar ve parçacıklar iki farklı şeydir. Bir parçacık ayrıca bir engelden “sızıntı yapabilir” ancak tamamen farklı sebeplerden dolayı. Bazen bir parçacık sistemi aynı zamanda etkinin satılmasına yardımcı olacak bir ışık da içerebilir (bir kamp ateşinin ya da ateşböceği sürüsünü düşünün), ancak bir parçacık etkisinin içindeki ışık hala sadece hafif, genellikle herhangi bir özel değişken değildir.
DMGregory

2
Alternatif bir yaklaşım, gölge haritalar olan gölge hacimleri yumuşatma sorununu giderir, fakat daha pahalı: gerektiren ilave geometri işlenip (a her ışık kaynağı için her nesnenin siluet kenar başına yeni bir çokgen) yanı sıra, ilave işleme geçer. Yine de haritalama yaklaşımının çoğu durum için yeterince iyi olacağını düşünüyorum.
DarthFennec

22

Uzun lafın kısası, bu performans nedenleriyle olur.

Ekranda bir ışık olduğunda, varsayılan olarak tüm nesnelerin üzerinde durur (engellenir veya edilmez), bu nedenle oyunun hangi nesnenin ne tarafından etkilendiğini görmek için ekstra hesaplamalar yapması gerekir.

Statik ve fırınlanmış aydınlatma kullanarak statik nesnelerde çözülmesi daha kolaydır, ancak not ettiğiniz patlamalar gibi dinamik ışıklarda bu aynı değildir.

Bonus sorunuz için, ışın izleme ve ucuz aynı cümleyle birlikte gitmez. Ray izlemenin şimdiye kadar yaygın olmamış olmasının tek nedeni performans. Tüm ışıkların ışın izleme kullandığını varsayarsak, o zaman bu sorun "çözülür", fakat performans pahasına.


6
Ray, CGI filmleri için gerçek zamanlı oyunlardan daha fazla bir şey izliyor mu?
Toplama

21
@ Toplama Bu doğru. Bir filmin tek bir karesinin oluşturulması saatlerce sürebilir, oyunda yalnızca milisaniye vardır.
NobodyNada - Monica

16
Bununla birlikte, oyunlar, rasterleştirme teknikleriyle birlikte art arda raytracing veya raymarching kullanarak keşfediyor, rasterizörün iyi olduğunu ve ışınlar da iyi olduklarını yapıyor. Her pikselin ışınımı tam değildir, ancak yine de bu şekilde bazı harika efektler alabilirsiniz.
DMGregory

2
@DMGregory Gerçekten de, Duke Nukem 3D gibi oyunlar zaten çok basitleştirilmiş bir ışın izleme çeşitliliği kullanıyorlardı - dinamik aydınlatma için kullanılmamasına rağmen, kesinlikle ekrandaki her bir pikselin izini sürmedi (genellikle, her sütun için yapıldı) piksel) ve yansımalar ve şeffaflık varsayılandan ziyade hala özel bir durumdu. Yazılım 3B oluşturma her zaman benzer yaklaşımlarla oynadı, bu caddeyi kapatan (şimdiye kadar) donanım 3B'siydi.
Luaan

@ Toplama Raytracing farklı seviyelerde gelir, böylece oyunlar hat donanımının tepesinde birincil ışınları çekerken, yine de yeterince sekonder sıçrama veya piksel başına birden fazla sıçrama yapmazlar. Yani izini sürseniz bile, yine de buna benzer performans değişimleri yaşarsınız. Bu yüzden, yetenek ana ışıklarını takip etmek hala tüm ikincil ışıkları açmayı göze alamayacağınız anlamına gelmez.
joojaa
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.