3D Oyun Oluşturma Nasıl Çalışır, Daha Derin Bir Dalış: Rasterleştirme ve Işın İzleme
By Nick Evanson on 22 Ağustos 2019
3D oyun oluşturmaya daha derinlemesine baktığımız bu ikinci bölümde, tüm köşe işlemi tamamlandıktan sonra 3D dünyasına ne olacağına odaklanacağız. Matematik ders kitaplarımızı tekrar tozdan arındırmalı, hayal kırıklıklarının geometrisiyle boğuşmalı ve perspektif bulmacasını düşünmeliyiz. Ayrıca ışın izleme, aydınlatma ve malzemelerin fiziğine hızlı bir dalış yapacağız - mükemmel!
Bu makalenin ana konusu, üç boyutlu nokta, çizgi ve üçgen dünyasının renkli blokların iki boyutlu bir ızgarası haline geldiği renderleme konusunda önemli bir aşamadır. Bu, sadece 'gerçekleşen' bir şeydir, çünkü 3D-2D değişimindeki süreçler görünmez, bizim önceki makale burada köşe gölgeleyicilerinin ve mozaiklerin etkilerini hemen görebiliyorduk. Tüm bunlara hazır değilseniz endişelenmeyin - başlayabilirsiniz. 3D Oyun Oluşturma 101. Ancak, ayarlandıktan sonra 3D grafik dünyasına bir sonraki bakışımız için okumaya devam edin.
Bölüm 0: 3D Oyun Oluşturma 101
Açıklanan Grafiklerin Yapımı
Bölüm 1: 3D Oyun Oluşturma Nasıl Çalışır: Köşe İşleme
3D Grafik Dünyasına Daha Derin Bir Dalış
Bölüm 2: 3D Oyun Oluşturma Nasıl Çalışır: Rasterleştirme ve Işın İzleme
3D'den Düz 2D'ye, POV ve Aydınlatmaya
Bölüm 3: 3D Oyun Oluşturma Nasıl Çalışır: Tekstüre
Bilineer, Trilinear, Anizotropik Filtreleme, Yumru Haritalama ve Daha Fazlası
2 boyuta hazırlanmak
Çoğunuz bu web sitesine tamamen düz bir monitör veya akıllı telefon ekranında bakacaksınız; çocuklarla serin ve sakin olsanız ve süslü bir kavisli monitörünüz olsa bile, görüntülediği görüntüler renkli piksellerden oluşan düz bir ızgaradan oluşur. Yine de, Call of Mario: Deathduty Battleyard'ı oynarken görüntüler 3 boyutlu gibi görünüyor. Nesneler, kameraya girip çıktıkça ortamın içine ve dışına hareket ederler.
Bethesda'yı kullanma Fallout 4 2014'ten örnek olarak, özellikle tel kafes modunda çalıştırıyorsanız (yukarıda) derinlik ve mesafe hissi yaratmak için köşelerin nasıl işlendiğini kolayca görebiliriz.
Bugünün veya son yirmi yılın herhangi bir 3D oyununu seçerseniz, hemen hemen her biri, köşelerin 3D dünyasını 2D piksel dizisine dönüştürmek için aynı olay dizisini gerçekleştirecektir. Değişikliği yapan sürecin adı sıklıkla çağrılır pikselleştirme ama bu tüm mesele içindeki birçok adımdan sadece biri.
Çeşitli aşamalardan bazılarını yıkmamız ve kullanılan teknikleri ve matematiği incelememiz gerekecek ve referans için neler olup bittiğini araştırmak için Direct3D tarafından kullanılan diziyi kullanacağız. Aşağıdaki görüntü, dünyadaki her bir tepe noktasına neler yapıldığını göstermektedir:
Direct3D dönüşüm hattı
Dünya uzay aşamasında neler yapıldığını Bölüm 1 makale: Burada köşeler çok sayıda matris hesaplaması kullanılarak dönüştürülür ve renklendirilir. Bir sonraki bölümü atlayacağız çünkü kamera alanı için olan tek şey, kamerayı referans noktası yapmak için dönüştürülmüş köşelerin taşındıktan sonra ayarlanmasıdır.
Sonraki adımlar atlamak için çok önemlidir, çünkü 3D'den 2D'ye geçiş yapmak için kesinlikle kritiktirler - doğru yapılır ve beyinlerimiz düz bir ekrana bakacak, ancak derinliği ve ölçeği olan bir sahneyi 'görecektir' - yanlış yapıldı ve işler çok tuhaf görünecek!
Her şey bir perspektif meselesi
Bu dizideki ilk adım, kamera tarafından görüldüğü gibi görüş alanının tanımlanmasını içerir. Bu, ilk olarak yatay ve dikey görüş alanı için açıları ayarlayarak yapılır - birincisi oyunlarda sıklıkla değiştirilebilir, çünkü insanlar yukarı ve aşağıya kıyasla daha iyi yan yana çevresel görüşe sahiptir.
İnsan vizyonu alanını gösteren bu görüntüden bunu anlayabiliriz:
Kaynak: Zyxwv99 | Wikimedia Commons
İki görüş açısı (kısaca fov), frustum - kameradan çıkan 3B kare tabanlı bir piramit. İlk açı dikey fov, ikincisi yatay bir; sembolleri kullanacağız α ve β onları göstermek için. Artık dünyayı bu şekilde tam olarak görmüyoruz, ancak gerçekçi bir görüntü hacmi oluşturmaya çalışmak yerine bir frustum çalışmak çok daha kolay.
Kaynak: MithrandirMage | Wikimedia Commons
Diğer iki ayarın da tanımlanması gerekir - yakın (veya ön) ve uzak (arka) konumu kırpma uçakları. Birincisi piramidin üstünü keser, ancak esas olarak kameranın herhangi bir şeyin çizildiği konuma ne kadar yakın olduğunu belirler; ikincisi de aynısını yapar ancak kameradan herhangi bir ilkel öğenin ne kadar uzakta oluşturulacağını tanımlar.
Yakın kırpma düzleminin boyutu ve konumu önemlidir, çünkü bu, Görünüm,. Bu aslında monitörde gördüğünüz şeydir, yani işlenmiş çerçeve ve çoğu grafik API'sında görünüm, sol üst köşesinden 'çizilir'. Aşağıdaki görüntüde nokta (a1, b2) düzlemin kaynağı olacaktır ve düzlemin genişliği ve yüksekliği buradan ölçülür.
en boy oranı bakış açısının yalnızca oluşturulan dünyanın nasıl görüneceği için çok önemli olmadığı, aynı zamanda monitörün en boy oranıyla da eşleşmesi gerekiyor. Uzun yıllar boyunca bu her zaman 4: 3'tür (veya ondalık değer olarak 1.3333 ...). Bugün, çoğumuz 16: 9 veya 21: 9 gibi geniş ekranlı ve ultra geniş ekranlı oyunlarımız var.
Kamera alanındaki her bir tepe noktasının koordinatlarının, aşağıda gösterildiği gibi hepsi yakın kırpma düzlemine sığacak şekilde dönüştürülmesi gerekir:
Yandan gelen frustum (ayrıldı) ve yukarıdan (sağ)
Dönüşüm başka bir matris kullanılarak yapılır - bu özel olana perspektif projeksiyon matrisi. Aşağıdaki örneğimizde, dönüşümü yapmak için kırpma alanını ve kırpma düzlemlerinin konumlarını kullanıyoruz; bunun yerine görünüm penceresinin boyutlarını kullanabiliriz.
Tepe konumu vektörü bu matrisle çarpılır ve yeni bir dönüştürülmüş koordinat seti verir.
Et voila! Şimdi tüm köşelerimizi, orijinal dünya şimdi zorlanmış bir 3D perspektifi olarak görünecek şekilde yazdık, böylece ön kırpma düzlemine yakın ilkeller uzak düzleme yakın olanlardan daha büyük görünüyor.
Görünümün boyutu ve görüş alanı açıları birbirine bağlı olsa da, bunlar ayrı ayrı işlenebilir - başka bir deyişle, görünümün boyutuna ve en boy oranına göre farklı bir kırpma düzlemi vermek için frustum'a sahip olabilirsiniz. Bunun gerçekleşmesi için, farkı hesaba katmak için yakın kırpma düzlemindeki köşelerin tekrar dönüştürülmesi gereken zincirde ek bir adım gereklidir.
Bununla birlikte, bu, görüntülenen perspektifte bozulmaya yol açabilir. kullanma Bethesda'nın 2011 oyunu Skyrim, yatay görüş açısının nasıl ayarlandığını görebiliriz β, aynı görüntü alanı en boy oranını korurken, sahne üzerinde önemli bir etkiye sahiptir:
Bu ilk görüntüde, β = 75 ° ve sahne mükemmel şekilde normal görünüyor. Şimdi deneyelim β = 120°:
İki fark hemen açıktır - her şeyden önce, şimdi 'vizyonumuzun' yanlarında çok daha fazlasını görebiliriz ve ikincisi, nesneler artık çok daha uzak görünüyor (özellikle ağaçlar). Ancak, su yüzeyinin görsel etkisi şu anda görünmüyor ve bunun nedeni, sürecin bu görüş alanı için tasarlanmamış olmasıdır.
Şimdi karakterimizin uzaylı ve göz gibi gözleri olduğunu varsayalım. β = 180°!
Bu görüş alanı bize neredeyse panoramik bir manzara veriyor, ancak görünümün kenarlarında oluşturulan nesnelere ciddi miktarda bozulma pahasına. Yine, bunun nedeni oyun tasarımcılarının oyunun varlıklarını ve görsel efektlerini bu görüş açısı için planlamaması ve yaratmamasıdır (varsayılan değer 70 ° civarındadır).
Kamera yukarıdaki görüntülerde hareket etmiş gibi görünebilir, ancak olmadı - olan tek şey, frustumun şeklinin değiştirilmesidir, bu da yakın kırpma düzleminin boyutlarını yeniden şekillendirdi. Her görüntüde, görüntü alanı en-boy oranı aynı kalmıştır, böylece her şeyi yeniden sığdırmak için köşelere bir ölçeklendirme matrisi uygulanmıştır.
Yani, içeride misin yoksa dışarıda mısın?
Projeksiyon aşamasında her şey doğru bir şekilde dönüştürüldükten sonra, denilen şeye geçiyoruz klip alanı. Bu yapılmasına rağmen sonra projeksiyon, daha önce yaparsak neler olduğunu görselleştirmek daha kolaydır:
Yukarıdaki diyagramımızda, lastik ördek, yarasalardan biri ve bazı ağaçların frustum içinde üçgenler olduğunu görebiliriz; ancak, diğer yarasa, en uzak ağaç ve panda frustumun dışındadır. Bu nesneleri oluşturan köşeler zaten işlenmiş olsa da, görünüm alanında görünmezler. Bu demek oluyor ki kısaltıldı.
In frustum kırpma, frustum dışındaki tüm ilkeler tamamen kaldırılır ve sınırlardan herhangi birinde bulunanlar yeni ilkellere yeniden şekillendirilir. Kırpma, bu noktaya kadar, görünür olmayan tüm köşeler köşe gölgelendiricileri vb. Yoluyla yürütüldüğünden, gerçekten bir performans artışı değildir. Gerekirse kırpma aşamasının kendisi de atlanabilir, ancak bu tüm API'lar tarafından desteklenmez (örneğin, standart OpenGL bunu atlamanıza izin vermez, ancak bir API uzantısı kullanarak bunu yapmak mümkündür) .
Uzak kırpma düzleminin konumunun mutlaka aynı olmadığını belirtmek gerekir. çizim mesafesi oyunlarda, ikincisi oyun motorunun kendisi tarafından kontrol edildiği için. Motorun yapacağı başka bir şey frustum itlaf - bu, bir nesnenin frustum içinde olup olmayacağını belirlemek ve / veya görünür olacak herhangi bir şeyi etkilemek için kodun çalıştırıldığı yerdir; cevap ise no, bu nesne oluşturma için gönderilmez. Bu, hayal kırıklığı kırpma ile aynı değildir, çünkü hayal kırıklığının dışındaki ilkel öğeler düşmüş olsa da, tepe işleme aşamasından geçmektedirler. Çıkarma ile, hiç işlenmezler, oldukça fazla performans tasarrufu sağlarlar.
Artık tüm dönüşümümüzü ve kırpmamızı yaptığımıza göre, köşelerin sonunda tüm oluşturma sırasındaki bir sonraki aşamaya hazır olduğu görülüyor. Dışında değiller. Bunun nedeni, tepe işlemesi ve dünyadan klibe boşluk işlemlerinde gerçekleştirilen tüm matematiklerin homojen bir koordinat sistemi ile yapılması gerektiğidir (yani her tepe noktasının 3 yerine 4 bileşeni vardır). Ancak, görünüm tamamen 2B'dir ve bu nedenle API köşe noktası bilgilerinin yalnızca x, y (derinlik değeri z olsa da korunur).
4. bileşenden kurtulmak için, perspektif bölümü her bir bileşenin w değer. Bu ayar, değer aralığını kilitler x ve y [-1,1] alabilir ve z [0,1] aralığına - bunlar denir normalleştirilmiş cihaz koordinatları (Kısaca NDC'ler).
Az önce neleri ele aldığımız hakkında daha fazla bilgi edinmek istiyorsanız ve çok daha fazla matematiğe dalmaktan mutluluk duyuyorsanız, Song Ho Ahn'ın mükemmel öğretici Konuyla ilgili. Şimdi bu köşeleri piksele dönüştürelim!
Dönüşümlerde olduğu gibi, Direct3D'nin görünüm penceresini bir piksel ızgarasına dönüştürmek için kuralları ve işlemleri nasıl ayarladığına bakacağız. Bu ızgara, her hücrenin birden fazla veri değeri (renk, derinlik değerleri, doku koordinatları vb.) İçerdiği satır ve sütunlara sahip bir e-tablo gibidir. Genellikle, bu ızgaraya raster ve onu üretme süreci pikselleştirme. Bizim 3D render 101 makale, prosedürün çok basitleştirilmiş bir görünümünü aldık:
Yukarıdaki görüntü, ilkellerin küçük bloklar halinde kesildiği izlenimini veriyor, ancak bunun için çok daha fazlası var. İlk adım, bir ilkelin gerçekte kameraya bakıp bakmadığını anlamaktır - bu makalenin önceki bir görüntüsünde, hayal kırıklığını gösteren, gri tavşanın arkasını oluşturan ilkeller, örneğin, görünür Ol. Bu nedenle, görüntü alanında bulunsalar da, bunları oluşturmaya gerek yok.
Aşağıdaki şema ile bunun nasıl göründüğünü kabaca anlayabiliriz. Küp, 3D modeli 2D ekran alanına koymak için çeşitli dönüşümlerden geçti ve kameranın görüşüne göre, küpün yüzlerinin bir kısmı görünmüyor. Yüzeylerin hiçbirinin şeffaf olmadığını varsayarsak, bu ilkellerin bir kısmı göz ardı edilebilir.
Soldan sağa: Dünya alanı> Kamera Alanı> Projeksiyon Alanı> Ekran Alanı
Direct3D'de bu, sisteme işleme durumu olacak ve bu talimat kaldırılmasını söyleyecektir (aka ıskartaya çıkarmak) her ilkel için öne bakan veya arkaya bakan taraflar (veya hiç kör olmamak - örneğin, tel kafes modu). Peki ön veya arka yüzün ne olduğunu nasıl bilebilir? Baktığımızda köşe işlemede matematik, üçgenlerin (veya daha fazla köşe noktası olması), sisteme hangi yöne baktığını söyleyen normal vektörlere sahip olduğunu gördük. Bu bilgi ile basit bir kontrol yapılabilir ve ilkel kontrol başarısız olursa, oluşturma zincirinden çıkarılır.
Ardından, piksel ızgarasını uygulamaya başlama zamanı. Yine, bu şaşırtıcı derecede karmaşıktır, çünkü bir piksel bir ilkelin içine tamamen uyuyorsa - tamamen, kısmen ya da hiç değilse - sistemin çalışması gerekir. Bunu yapmak için, kapsam testi tamamlandı. Aşağıdaki resim Direct3D 11'de üçgenlerin nasıl rasterleştirildiğini göstermektedir:
Kaynak: Microsoft Direct3D belgeleri
Kural oldukça basittir: Piksel merkezi Microsoft'un dediği şeyden geçerse, pikselin üçgen içinde olduğu kabul edilir. 'sol üst' kural. 'Üst' kısım yatay bir çizgi kontrolüdür; piksel merkezi on bu hat. 'Sol' kısım yatay olmayan çizgiler içindir ve piksel merkezi böyle bir çizginin soluna düşmelidir. İlkel olmayanlar için ek kurallar vardır, yani basit çizgiler ve noktalar ve eğer kurallar ekstra koşullar kazanırsa multisampling'i istihdam edilir.
Microsoft'un belgelerindeki görüntüye dikkatlice bakarsak, pikseller tarafından oluşturulan şekillerin orijinal ilkellere çok benzemediğini görebiliriz. Bunun nedeni, piksellerin gerçekçi bir üçgen oluşturmak için çok büyük olması - raster, orijinal nesneler hakkında yetersiz veri içermesi ve örtüşme.
Kullanalım UL Benchmark'ın 3DMark03 takma adı işlemede görmek için:
Raster 720 x 480 piksel olarak ayarlandı
İlk görüntüde, tarama boyutu 720 x 480 piksel boyutunda çok düşük bir değere ayarlanmıştır. Küpeşte üzerinde örtüşme açıkça görülebilir ve gölge üst askerin elinde bulunan silahı fırlatır. Bunu, 24 kat daha fazla piksele sahip bir tarama ile elde ettiğinizle karşılaştırın:
Raster 3840 x 2160 piksel olarak ayarlandı
Burada, küpeşte ve gölge üzerindeki takma adın tamamen gittiğini görebiliriz. Her seferinde daha büyük bir tarama yolu gibi görünebilir, ancak çerçevenin görüntüleneceği monitör tarafından ızgaranın boyutları desteklenmeli ve rasterleştirme işleminden sonra bu piksellerin işlenmesi gerektiği göz önüne alındığında bariz bir performans cezası olmak.
Çoklu örneklemenin yardımcı olabileceği yer burasıdır ve Direct3D'de şu şekilde çalışır:
Bir piksel merkezinin rasterleştirme kurallarına uygun olup olmadığını kontrol etmek yerine, birden fazla konum (alt piksel örnekleri veya alt örnekler) her piksel içinde test edilir ve bunlardan herhangi biri uygunsa, bu piksel şeklin bir parçasını oluşturur. Bunun bir faydası olmayabilir ve hatta takma adı daha da kötüleştirebilir, ancak çoklu örnekleme kullanıldığında, hangi alt örneklerin ilkel tarafından kaplandığı ve piksel işlemenin sonuçları bellekte bir tamponda saklanır.
Bu tampon daha sonra alt örnek ve piksel verilerini, ilkel kenarları daha az bloklu olacak şekilde karıştırmak için kullanılır. Daha sonraki bir makalede tüm takma duruma tekrar bakacağız, ancak şimdilik, çok az pikselli bir taramada kullanıldığında çoklu örneklemenin yapabileceği şey budur:
Çeşitli şekillerin kenarlarındaki kenar yumuşatma miktarının büyük ölçüde azaldığını görebiliriz. Daha büyük bir raster kesinlikle daha iyidir, ancak performans isabeti bunun yerine çoklu örneklemenin kullanılmasını destekleyebilir.
Rasterleştirme sürecinde yapılabilecek başka bir şey oklüzyon testi. Bu yapılmalıdır çünkü görüntü alanı üst üste binecek ilkellerle dolu olacaktır (tıkalı) - örneğin, yukarıdaki görüntüde, ön planda solideri oluşturan ön taraftaki üçgenler diğer askerdeki aynı üçgenlerle örtüşüyor. Bir ilkel bir pikselin örtülüp örtülmediğini kontrol etmenin yanı sıra, göreceli derinlikler de karşılaştırılabilir ve biri diğerinin arkasındaysa, oluşturma işleminin geri kalanından atlanabilir.
Bununla birlikte, yakın ilkel şeffafsa, oklüzyon kontrolünde başarısız olmasına rağmen, diğeri hala görünür olacaktır. Bu yüzden neredeyse tüm 3D motorlar oklüzyon kontrolleri yapar önce GPU'ya bir şey göndermek ve bunun yerine Z-tampon oluşturma sürecinin bir parçası olarak. Bu, çerçevenin normal olarak oluşturulduğu yerdir, ancak GPU son piksel renklerini bellekte saklamak yerine sadece derinlik değerlerini saklar. Bu daha sonra gölgelendiricilerde, nesnenin çakışmasını içeren yönler üzerinde daha fazla kontrol ve hassasiyetle görünürlüğü kontrol etmek için kullanılabilir.
Kaynak: -Zeus- | Wikimedia Commons
Yukarıdaki görüntüde, pikselin rengi koyulaştıkça, nesne kameraya daha yakındır. Z tamponunu yapmak için çerçeve bir kez oluşturulur, sonra tekrar oluşturulur, ancak bu kez pikseller işlendiğinde, z tamponundaki değerlere karşı onları kontrol etmek için bir gölgelendirici çalıştırılır. Görünmüyorsa, bu piksel rengi son çerçeve arabelleğine yerleştirilmez.
Şimdilik, asıl son adım köşe özniteliği enterpolasyonu - ilk basitleştirilmiş diyagramımızda, ilkel tam bir üçgendi, ancak görünümün şeklin kendisi ile değil, şekillerin köşeleriyle dolu olduğunu unutmayın. Bu yüzden sistem, ilkelin rengi, derinliği ve dokusunun köşeler arasında nasıl olduğunu bulması gerekir ve buna denir. interpolasyon. Tahmin edebileceğiniz gibi, bu da basit bir hesaplama değil, başka bir hesaplama.
Rasterleştirilmiş ekranın 2D olmasına rağmen, içindeki yapılar zorlanmış bir 3D perspektifini temsil ediyor. Çizgiler gerçekten 2 boyutlu olsaydı, basit bir doğrusal bir tepe noktasından diğerine giderken çeşitli renkleri vb. Ancak sahnenin 3B yönü nedeniyle, enterpolasyonun perspektifi hesaba katması gerekir - Simon Yeung'un muhteşem blogu süreç hakkında daha fazla bilgi almak.
İşte başlıyoruz - köşelerin 3D dünyası renkli blokların 2D ızgarası haline geliyor. Yine de pek işimiz bitmedi.
Her şey önden arkaya (olmadığı zamanlar hariç)
Rasterleştirmeye bakışımızı bitirmeden önce, oluşturma sırasının sırası hakkında bir şeyler söylememiz gerekir. Örneğin mozaiklemenin sırayla nereden geldiğinden bahsetmiyoruz; bunun yerine, ilkellerin işlenme sırasından bahsediyoruz. Nesneler genellikle dizin arabelleğinde (sisteme köşelerin nasıl gruplandığını söyleyen bellek bloğu) göründükleri sırayla işlenir ve bu saydam nesnelerin ve efektlerin nasıl işlendiği üzerinde önemli bir etkiye sahip olabilir.
Bunun nedeni, ilkellerin birer birer ele alınmasına bağlıdır ve ilk önce öndeki olanları yaparsanız, arkasından herhangi biri görünür olmaz (bu, oklüzyon ayıklamanın gerçekten devreye girdiği yerdir). ve işlemden çıkarılabilir (performansa yardımcı olur) - buna genellikle 'önden arkaya' oluşturma ve dizin arabelleğinin bu şekilde sipariş edilmesini gerektirir.
Bununla birlikte, kameranın hemen önündeki bu ilkellerden bazıları şeffafsa, önden arkaya görüntü oluşturma, saydam olanın arkasındaki nesnelerin kaçırılmasına neden olur. Bir çözüm, şeffaf ilkeller ve efektlerin en son yapılmasıyla her şeyi önden arkaya yapmaktır.
Soldan sağa: sahne sırası, önden arkaya işleme, arkadan öne işleme
Yani tüm modern oyunlar arka arkaya render yapıyor, değil mi? Yardım edilebiliyorsa değil - her bir ilkel oluşturmanın, yalnızca görülebilenlere göre çok daha yüksek bir performans maliyetine sahip olacağını unutmayın. Saydam nesneleri ele almanın başka yolları da vardır, ancak genel olarak konuşursak, herkese uyan bir çözüm yoktur ve her durumun benzersiz bir şekilde ele alınması gerekir.
Bu temelde rasterleştirmenin artılarını ve eksilerini özetliyor - modern donanımda, gerçekten hızlı ve etkilidir, ancak yine de gördüğümüz şeyin bir yaklaşımıdır. Gerçek dünyada, her nesne ışığı emer, yansıtır ve belki de kırır ve bunların tümü görüntülenen sahne üzerinde bir etkiye sahiptir. Dünyayı ilkellere bölerek ve sonra sadece bazılarını yaratarak hızlı ama kaba bir sonuç elde ederiz.
Keşke başka bir yol olsaydı ...
Orada is başka bir yol: Işın izleme
Yaklaşık yirmi yıl önce, Arthur Appel adlı bir bilgisayar bilimcisi bir bilgisayarda görüntü oluşturmak için bir sistem geliştirdi, böylece bir nesneye çarpana kadar kameradan tek bir ışık ışını düz bir çizgide yayınlandı. Oradan, malzemenin özellikleri (rengi, yansıtıcılığı, vb.) Daha sonra ışık ışınının yoğunluğunu değiştirir. Oluşturulan görüntüdeki her piksel bir ışın dökümüne sahip olacak ve pikselin rengini çözmek için bir matematik dizisinden geçerek bir algoritma gerçekleştirilecekti. Appel'in süreci Ray dökümü.
Yaklaşık 10 yıl sonra, başka bir bilim adamı John Whitted Appel'in yaklaşımıyla aynı olan bir matematik algoritması geliştirdi, ancak ışın bir nesneye çarptığında, nesnenin malzemesine bağlı olarak çeşitli yönlerde ateşlenecek ek ışınlar üretecekti. Bu sistem her nesne etkileşimi için yeni ışınlar üreteceğinden, algoritma özyinelemeli ve dolayısıyla hesaplama açısından çok daha zordu; ancak yansıma, kırılma ve gölgelemeyi düzgün bir şekilde açıklayabileceğinden Appel'in yöntemine göre önemli bir avantajı vardı. Bu prosedürün adı: Işın izleme (açık konuşmak gerekirse, geriye doğru ışın izleme, biz objeyi değil kameradan gelen ışını takip gibi) ve bilgisayar grafikleri için kutsal kâse ve filmler o zamandan beri.
Bu prosedürün adı ışın izleme (kesinlikle konuşursak, ışınları nesnelerden değil kameradan takip ettiğimiz için geriye doğru ışın izleme) idi ve o zamandan beri bilgisayar grafikleri ve filmler için kutsal kâse oldu.
Yukarıdaki görüntüde, Whitted'in algoritma çalışmaları hakkında bir fikir edinebiliriz. Fotoğraf makinesinden, çerçevedeki her piksel için bir ışın yayılır ve bir yüzeye ulaşıncaya kadar hareket eder. Bu özel yüzey yarı saydamdır, bu nedenle ışık yansıyacak ve içinden kırılacaktır. Her iki durumda da ikincil ışınlar üretilir ve bunlar bir yüzeyle etkileşene kadar dışarı çıkarlar. Işık kaynaklarının rengini ve yaptıkları gölgeleri hesaba katan ek ikincil de var.
Sürecin özyinelemeli kısmı, yeni bir döküm ışınının bir yüzeyle her kesişmesinde ikincil ışınların üretilebilmesidir. Bu kolayca kontrolden çıkabilir, bu nedenle üretilen ikincil ışınların sayısı her zaman sınırlıdır. Bir ışın yolu tamamlandığında, her bir terminal noktasındaki rengi, o yüzeyin malzeme özelliklerine göre hesaplanır. Bu değer daha sonra ışını bir öncekine geçirir, o yüzeyin rengini ayarlar ve böylece birincil ışının etkili başlangıç ​​noktasına (çerçevedeki piksel) ulaşıncaya kadar devam eder.
Bu son derece karmaşık olabilir ve basit senaryolar bile içinden geçmek için bir hesaplama barajı oluşturabilir. Neyse ki, yardımcı olmak için bazı şeyler yapılabilir - biri, bu belirli matematik işlemlerini hızlandırmak için özel olarak tasarlanan donanımı kullanmak olacaktır, tıpkı köşe işlemede matris matematiğini yapmak için olduğu gibi (bir anda daha fazlası) ). Bir başka kritik olan, bir ışının hangi nesneye çarptığını ve kesiştiği nesnenin yüzeyinde tam olarak nerede olduğu üzerinde çalışmak için yapılan işlemi hızlandırmaktır - nesne çok sayıda üçgenden yapılmışsa, bu şaşırtıcı olabilir. yapması zor:
Kaynak: Nvidia RTX ile gerçek zamanlı ışın izleme
Her bir üçgeni test etmek yerine, her bir nesnede, ışın izlemeden önce bir sınırlayıcı hacimler listesi (BV) oluşturulur - bunlar, söz konusu nesneyi çevreleyen küplerden başka bir şey değildir ve içindeki çeşitli yapılar için art arda daha küçük olanlardır. nesne.
Örneğin, ilk BV tüm tavşan için olacaktır. Sonraki çift başını, bacaklarını, gövdesini, kuyruğunu vb. bunlardan her biri daha sonra kafadaki küçük yapılar, vb. için başka bir cilt koleksiyonu olacak ve nihai hacim seviyesi test edilecek az sayıda üçgen içeren olacaktır. Bu hacimlerin tümü daha sonra sıralı bir listede düzenlenir ( BV hiyerarşisi veya kısaca BVH), sistem her seferinde nispeten az sayıda BV'yi kontrol edecek şekilde:
Bir BVH'nin kullanımı gerçek ışın izlemeyi teknik olarak hızlandırmasa da, hiyerarşinin ve daha sonraki arama algoritmasının oluşturulması genellikle bir ışının milyonlarca üçgenden biriyle kesişip kesişmediğini kontrol etmek zorunda kalmaktan çok daha hızlıdır. 3D dünyada.
Bugün gibi programlar karıştırıcı ve POV-Ray son derece gerçekçi görüntüler oluşturmak için ışın izlemeyi ek algoritmalar (foton izleme ve radyo gibi) kullanarak kullanın:
Kaynak: Gilles Tran | Wikimedia Commons
Sorulması gereken açık soru, ışın izlemenin bu kadar iyi olup olmadığı, neden her yerde kullanmıyoruz? Cevaplar iki alandadır: her şeyden önce, basit ışın izleme bile, tekrar tekrar hesaplanması gereken milyonlarca ışın üretir. Sistem, ekran pikseli başına sadece bir ışınla başlar, bu yüzden sadece 800 x 600 çözünürlüğünde, 480.000 birincil ışın üretir ve her biri birden çok ikincil ışın üretir. Bu, günümüzün masaüstü bilgisayarları için bile ciddi bir iştir. İkinci konu, temel ışın izlemenin aslında çok gerçekçi olmadığı ve doğru olması için bir dizi ekstra, çok karmaşık denklemin dahil edilmesi gerektiğidir.
Modern PC donanımı ile bile, mevcut bir 3D oyun için bunu gerçek zamanlı olarak yapmak için gereken iş miktarı kapsamın ötesindedir. Bizim 3D render 101 makalesinde, bir ışın izleme ölçütünde, tek bir düşük çözünürlüklü görüntü üretmenin onlarca saniye sürdüğünü gördük.
Peki orijinal nasıldı Wolfenstein 3D ışın dökümü yapıyor, 1992'de geri dönüyor ve neden beğeniliyor Savaş Alanı V ve Metro Göçü, her ikisi de 2019'da piyasaya sürüldü, ışın izleme özellikleri sunuyor mu? Rasterleştirme veya ışın izleme yapıyorlar mı? Cevap: ikisinden de biraz.
Bugün ve gelecek için melez yaklaşım
Mart 2018'de Microsoft, Direct3D 12 için DXR (DirectX Raytracing) adlı yeni bir API uzantısı duyurdu. Bu, standart rasterleştirmeyi ve hesaplama boru hatlarını tamamlayan yeni bir grafik hattıydı. Ek işlevsellik, gölgelendiricilerin, veri yapılarının vb. Tanıtılmasıyla sağlandı, ancak Direct3D 12 için zaten gerekli olandan başka herhangi bir özel donanım desteği gerektirmedi.
Aynı Oyun Geliştiricileri Konferansı'nda, Microsoft DXR hakkında konuştu, Electronic Arts onların hakkında konuştu Pica Pica Projesi - DXR kullanan bir 3D motor deneyi. Işın izlemenin kullanılabileceğini gösterdiler, ancak tüm oluşturma çerçevesi için kullanılamayacaklarını gösterdiler. Bunun yerine, geleneksel rasterleştirme ve hesaplama gölgelendirici teknikleri, işin büyük kısmı için kullanılacaktır, belirli alanlar için DXR kullanılır - bu, üretilen ışınların sayısının tüm sahne için olduğundan çok daha az olduğu anlamına gelir.
Bu melez yaklaşım geçmişte de olsa daha az kullanılmıştı. Örneğin, Wolfenstein 3D kullanılan ray döküm işlenen çerçevenin nasıl göründüğünü, ancak piksel başına değil piksel sütun başına bir ışınla yapıldığını çözmek için. Oyunun başlangıçta 640 x 480 çözünürlükte çalıştığını anlayana kadar bu hala çok etkileyici görünebilir, bu yüzden aynı anda 640'dan fazla ışın çalışmıyordu.
2018'in başındaki grafik kartı - AMD'nin Radeon RX 580 veya Nvidia'nın GeForce 1080 Ti gibi - kesinlikle DXR için donanım gereksinimlerini karşıladı, ancak bilgi işlem yetenekleriyle bile, DXR'yi gerçekten kullanabilecek kadar güçlü olacakları konusunda bazı endişeler vardı. anlamlı bir şekilde.
Nvidia'nın en yeni GPU mimarisini başlattığı Ağustos 2018'de bu biraz değişti, kod adlı Turing. Bu çipin kritik özelliği, RT-Cores (RT Çekirdekleri) olarak adlandırılan bir şeydi: ışın-üçgen kesişimini ve sınırlayıcı hacim hiyerarşisi (BVH) çapraz hesaplamalarını hızlandırmak için özel mantık birimleri. Bu iki süreç, bir ışığın bir sahne içinde çeşitli nesneleri oluşturan üçgenlerle etkileştiği yerlerde çalışmak için zaman alıcı rutinlerdir. RT Çekirdeklerinin Turing işlemcisine özgü olduğu düşünüldüğünde, bunlara erişim yalnızca Nvidia'nın tescilli API'sı aracılığıyla yapılabilir.
Bu özelliği destekleyen ilk oyun EA's Battlefield V ve DXR kullanımını test ettiğimizde, oyundaki su, cam ve metal yansımalarındaki iyileşmeden etkilendik, ancak daha sonraki performans isabetiyle daha az etkilendik:
Adil olmak gerekirse, daha sonraki yamalar bir şekilde gelişti, ancak çerçevelerin oluşturulma hızında büyük bir düşüş oldu (ve hala da). 2019'a kadar, bu API'yi destekleyen ve bir çerçevedeki belirli parçalar için ışın izleme gerçekleştiren başka bazı oyunlar ortaya çıktı. Test ettik Metro Göçü ve Tomb Raider Gölgesive benzer bir hikaye buldu - yoğun olarak kullanıldığında, DXR kare hızını önemli ölçüde etkilerdi.
Yaklaşık aynı zamanda, UL Benchmarks açıkladı için bir DXR özellik testi 3DMark:
Nvidia Titan X (Pascal) grafik kartında kullanılan DXR - evet, gerçekten 8 fps oldu
Bununla birlikte, DXR özellikli oyunları ve 3DMark özellik testini incelememiz, ışın izleme konusunda bir şeyin kesin olduğunu kanıtladı: 2019'da, grafik işlemcisi için 1000 $ + modelleri için bile hala ciddi bir çalışma. Peki bu, rasterleştirmeye gerçek bir alternatifimiz olmadığı anlamına mı geliyor?
Tüketici 3D grafik teknolojisindeki en son özellikler genellikle çok pahalıdır ve yeni API özelliklerinin ilk desteği oldukça düzensiz veya yavaş olabilir (bulduğumuz gibi) Max Payne 3'ü test ettiğimizde 2012 dolaylarında bir dizi Direct3D sürümünde) - ikincisi genellikle oyun geliştiricilerinin, bazen sınırlı deneyime sahip olabildiğince gelişmiş özelliklerin çoğunu dahil etmeye çalışmasından kaynaklanmaktadır.
Ancak, köşe ve piksel gölgelendiricileri, tesselasyon, HDR oluşturma ve ekran alanı ortam tıkanıklığı bir zamanlar oldukça talepkar, sadece üst düzey GPU'lar için uygun olduğunda, kullanımları artık oyunlarda yaygındır ve çok çeşitli grafik kartları tarafından desteklenmektedir. Aynı şey ışın izleme ve verilen süre için de geçerli olacak, sadece çoğu kullanıcı için varsayılan olarak etkinleştirilen başka bir ayrıntı ayarı olacak.
Bazı kapanış düşünceleri
Ve böylece 3D grafik dünyasına daha yakından baktığımız ikinci derin dalışımızın sonuna geldik. Modellerin ve dünyaların köşelerinin 3 boyuttan nasıl kaydırıldığına ve düz, 2D bir resme nasıl dönüştürüldüğüne baktık. Görüş alanı ayarlarının nasıl dikkate alınması gerektiğini ve hangi etkiyi ürettiklerini gördük. Bu köşeleri piksel haline getirme süreci araştırıldı ve rasterleştirmeye alternatif bir işleme kısa bir bakışla bitirdik.
Daha önce olduğu gibi, her şeyi ele alamıyorduk ve burada ve orada birkaç ayrıntıya göz atamadık - sonuçta bu bir ders kitabı değil! Ancak, bu yol boyunca biraz daha fazla bilgi edindiğinizi ve tüm bunları en sevdiğiniz 3D oyunlarınızda gerçekleştirmek için gerekli olan matematik ve bilime gerçekten hakim olan programcılar ve mühendisler için yeni bir hayranlığa sahip olduğunuzu umuyoruz.
Sorularınızı yanıtlamaktan mutluluk duyarız, bu yüzden bunları yorum bölümünde yolumuzu göndermekten çekinmeyin. Bir sonrakine kadar.
Masthead kredisi: Tek renkli baskı raster soyut by Aleksei Derin
6 yorum 93 etkileşim