Mükemmel oyun PC'nizde en son Call of Mario: Deathduty Battleyard'ı oynuyorsunuz. Muhteşem manzaraya ve karmaşık ayrıntılara hayran kalarak güzel bir 4K ultra geniş ekran monitöre bakıyorsunuz. Bu grafiklerin oraya nasıl geldiğini hiç merak ettiniz mi? PC'nizin bunları yapmak için ne yaptığını merak ediyor musunuz?

3D oyun oluşturma konusundaki 101'imize hoş geldiniz: Oyun iyiliğinin temel bir çerçevesinin nasıl yapıldığına dair bir başlangıç ​​kılavuzu.

Her yıl dünya çapında yüzlerce yeni oyun piyasaya sürülüyor - bazıları cep telefonları için, bazıları konsollar için, bazıları PC'ler için tasarlandı. Kapsanan formatlar ve türler kadar kapsamlıdır, ancak oyun geliştiricileri tarafından muhtemelen diğer türlerden daha fazla keşfedilen bir tür vardır: 3D. İlkinin ilk tartışması ve tartışmaların hızlı bir şekilde taranması Guinness Dünya Rekorları veritabanı çeşitli cevaplar üretir. 1984'te piyasaya sürülen Ultimate tarafından Knight Lore'u değerli bir başlangıç ​​olarak seçebilirdik, ancak bu oyunda oluşturulan görüntüler kesinlikle 2D konuşuyordu - kullanılan bilgilerin hiçbir kısmı gerçekten 3 boyutlu değil.

Dolayısıyla, bugünün 3D oyununun görüntülerini nasıl yaptığını anlayacaksak, farklı bir başlangıç ​​örneğine ihtiyacımız var: Kazanan Koşu Belki de şu an olanlardan bir milyon mil uzakta olmayan teknikleri kullanarak, başlangıçtan itibaren 3 boyutta her şeyi yapmak türünün ilk örneğiydi. Tabii ki, 30 yaşın üzerindeki herhangi bir oyun, örneğin Codemaster’ın F1 2018 ile aynı olmayacak, ancak hepsini yapmanın temel şeması çok farklı değil.




Bu makalede, bir 3D oyunun bir monitör veya TV'nin göstermesi için temel bir görüntü üretmek için izlediği süreci inceleyeceğiz. Sonuçla başlayıp kendimize şunu soracağız: “Neye bakıyorum?”

Oradan, gördüğümüz resmi elde etmek için yapılan her adımı analiz edeceğiz. Yol boyunca, köşeler ve pikseller, dokular ve geçişler, tamponlar ve gölgelendirme gibi yazılımları ve talimatları ele alacağız. Ayrıca, grafik kartının tüm bunlara nereden uyduğuna ve neden gerekli olduğuna da bakacağız. Bu 101 ile oyunlarınıza ve PC'nize yeni bir ışıkla bakacak ve bu grafikleri biraz daha hayranlıkla takdir edeceksiniz.

Çerçevenin boyutları: pikseller ve renkler

Bir 3D oyunu başlatalım, bu yüzden başlayacağımız bir şey var ve muhtemelen tüm zamanların en değerli oyunundan başka bir sebep olmadan Crytek’in 2007 sürümünü kullanacağız crysis. Aşağıdaki resimde, oyunu gösteren monitörün kamera görüntüsünü arıyoruz.




Bu resme genellikle çerçeve, ama tam olarak neye bakıyoruz? Peki, oyun içi ekran görüntüsü yerine makro lensli bir kamera kullanarak, CSI: TECH HABERLERİ ve birisinin bunu geliştirmesini talep edin!

Ne yazık ki ekran parlaması ve arka plan aydınlatması görüntü detayının önüne geçiyor, ancak biraz daha geliştirirsek ...

Monitördeki çerçevenin ayrı ayrı renkli elemanlardan oluşan bir ızgaradan oluştuğunu görebiliriz ve gerçekten yakından bakarsak, blokların kendileri 3 küçük bitten oluşur. Her üçlüye bir piksel (resim öğesi kısaltması) ve monitörlerin çoğu bunları üç renk kullanarak boyar: kırmızı, yeşil ve mavi (aka RGB). Monitör tarafından görüntülenen her yeni çerçeve için, milyonlarca olmasa bile binlerce RGB değerinin bir listesinin hazırlanması ve monitörün erişebileceği bir bellek bölümünde saklanması gerekir. Bu tür bellek blokları denir tamponlar, doğal olarak, monitöre çerçeve arabelleği.

Bu aslında başladığımız son nokta, bu yüzden şimdi başlangıca gitmeli ve oraya varmak için süreçten geçmeliyiz. İsim sıva bunu tanımlamak için sıklıkla kullanılır, ancak gerçek şu ki, ne olduğu açısından birbirinden oldukça farklı, bağlantılı ama ayrı aşamaların uzun bir listesidir. Bunu bir şef olmak ve bir Michelin yıldızlı restorana layık bir yemek yapmak gibi düşünün: sonuç, bir tabak lezzetli yemek, ancak içeri girmeden önce yapılması gereken çok şey var. bazı temel maddeler.

İhtiyaç duyulan yapı taşları: modeller ve dokular

Herhangi bir 3D oyunun temel yapı taşları, oluşturulacak dünyayı dolduracak görsel varlıklardır. Filmler, TV şovları, tiyatro yapımları ve benzerleri, hepsi aktörlere, kostümlere, sahne malzemelerine, arka planlara, ışıklara ihtiyaç duyar - liste oldukça büyük. 3D oyunlar farklı değildir ve oluşturulan bir çerçevede görülen her şey sanatçılar ve modelciler tarafından tasarlanacaktır. Bunu görselleştirmeye yardımcı olmak için eski okula gidip Software'in Quake II kimliğinden bir modele göz atalım:

20 yıl önce piyasaya sürülen Quake II, yirmi yıllık herhangi bir 3D oyun gibi, modellerin biraz bloklu göründüğünü söylemek doğru olsa da, teknolojik bir tur güçtü. Ancak bu, bu varlığın neden yapıldığını daha kolay görmemizi sağlar.

İlk görüntüde, tıknaz arkadaşın bağlı üçgenler oluşturduğunu görebiliriz - her birinin köşeleri denir köşe veya bunlardan biri için tepe noktası. Her tepe noktası uzayda bir nokta görevi görür, bu yüzden onu tanımlamak için en az 3 sayıya sahip olur, yani x, y, z koordinatları. Ancak, bir 3D oyun bundan daha fazlasına ihtiyaç duyar ve her tepe noktası, tepe noktasının rengi, baktığı yön gibi bazı ek değerlere sahip olacaktır (evet, noktalar aslında hiçbir yere bakamaz ... sadece onunla yuvarlan! ), ne kadar parlak, yarı saydam olsun ya da olmasın, vb.

Köşelerin her zaman sahip olduğu belirli bir değer kümesi, doku haritaları. Bunlar, modelin giymesi gereken 'kıyafetlerin' bir resmidir, ancak düz bir görüntü olduğundan, harita, modele bakabileceğimiz her olası yön için bir görünüm içermelidir. Quake II örneğimizde, bunun oldukça basit bir yaklaşım olduğunu görebiliriz: ön, arka ve yanlar (kolların). Modern bir 3D oyun aslında her biri ayrıntılarla dolu modeller için birden fazla doku haritasına sahip olacak; haritaların bazıları malzeme veya özellik gibi görünmez, bunun yerine ışığın yüzeyden nasıl sıçrayacağı hakkında bilgi sağlar. Her tepe noktası, modelin ilişkili doku haritasında bir dizi koordinat içerecektir, böylece tepe noktasında 'birleştirilebilir' - bu, tepe noktası hareket ettirilirse, dokunun onunla birlikte hareket ettiği anlamına gelir.

Yani 3B oluşturulmuş bir dünyada, görülen her şey köşe noktaları ve doku haritaları koleksiyonu olarak başlayacaktır. Birbirine bağlanan bellek tamponlarına harmanlanırlar - a köşe tamponu köşeler hakkında bilgi içerir; bir dizin arabelleği köşelerin form şekillerine nasıl bağlandığını bize gösterir; bir kaynak tamponu oluşturma işleminde daha sonra kullanılmak üzere ayrılmış bellek dokularını ve kısımlarını içerir; bir komut arabelleği hepsiyle ne yapılacağıyla ilgili talimatların listesi.

Bu, renkli piksellerin son ızgarasını oluşturmak için kullanılacak gerekli çerçeveyi oluşturur. Bazı oyunlar için çok büyük miktarda veri olabilir, çünkü her yeni çerçeve için tamponları yeniden oluşturmak çok yavaş olur. Oyunlar, potansiyel olarak görüntülenebilecek tüm dünyayı oluşturmak için gereken tüm bilgileri depolar, arabelleklerde saklar veya çok çeşitli görünümleri kapsayacak şekilde depolar ve ardından gerektiği gibi günceller. Örneğin, F1 2018 gibi bir yarış oyunu, geniş bir tampon koleksiyonunda her şeye sahip olacakken, Bethesda'nın Skyrim gibi açık bir dünya oyunu, kamera dünya çapında hareket ettikçe verileri tamponların içine ve dışına taşıyacak.

Sahneyi düzenleme: Tepe aşaması

Elindeki tüm görsel bilgilerle, bir oyun daha sonra görsel olarak görüntülenmesi için işleme başlayacaktır. Başlangıç ​​olarak, sahne varsayılan bir konumda başlar, hepsi temel bir şekilde konumlandırılmış modeller, ışıklar vb. Bu 'sıfır' karesi olacaktır - grafiklerin başlangıç ​​noktasıdır ve genellikle gösterilmez, sadece işleri devam ettirmek için işlenir. Oluşturma işleminin ilk aşamasında neler olduğunu göstermeye yardımcı olmak için, Gerçek Zamanlı Oluşturma web sitesi. Çok temel bir 'oyun' ile açalım: yerde bir küboid.

Bu özel şekil, her biri bir sayı listesi aracılığıyla açıklanan 8 köşe içerir ve aralarında 12 üçgen içeren bir model oluştururlar. Bir üçgen veya bir bütün nesne bile ilkel. Bu ilkeller hareket ettirildikçe, döndürüldükçe ve ölçeklendikçe, sayılar bir dizi matematik işleminden geçirilir ve buna göre güncellenir.

Modelin puan numaralarının değişmediğini, yalnızca dünyanın nerede olduğunu gösteren değerlerin değiştiğini unutmayın. İlgili matematiğin kapsanması bu 101'in kapsamı dışındadır, ancak bu sürecin önemli kısmı her şeyin ilk olması gereken yere taşınmasıdır. Sonra bir renklendirme zamanı.

Bir önceki küboidin sahip olduğu köşe sayısının 10 katından fazla olan farklı bir model kullanalım. En temel renk işleme türü, her bir tepe noktasının rengini alır ve daha sonra yüzey yüzeyinin aralarında nasıl değiştiğini hesaplar; bu olarak bilinir interpolasyon.

Bir modelde daha fazla köşeye sahip olmak sadece daha gerçekçi bir varlığa sahip olmakla kalmaz, aynı zamanda renk enterpolasyonu ile daha iyi sonuçlar verir.

Oluşturma sekansının bu aşamasında, sahnede ışıkların etkisi ayrıntılı olarak araştırılabilir; örneğin, modelin malzemelerinin ışığı nasıl yansıttığı tanıtılabilir. Bu tür hesaplamalar, dünyayı görüntüleyen kameranın konumunu ve yönünü, ayrıca ışıkların konumunu ve yönünü dikkate almalıdır.

Burada kullanılabilecek bir dizi farklı matematik tekniği vardır; bazıları basit, bazıları çok karmaşık. Yukarıdaki görüntüde, sağdaki sürecin daha hoş ve daha gerçekçi sonuçlar verdiğini görebiliriz, ancak şaşırtıcı değil, çalışmak daha uzun sürüyor.

Bu noktada, en yeni 3D oyuna kıyasla az sayıda köşe noktasına sahip nesnelere baktığımızı belirtmek gerekir. Bu makalede biraz geriye dönün ve Crysis'in imajına dikkatlice bakın: sadece o sahnede bir milyondan fazla üçgen var. Modern bir oyunda kaç tane üçgenin itildiğini görsel olarak anlayabiliriz. Unigine’nin Vadisi karşılaştırması (indir).

Bu görüntüdeki her nesne, birbirine bağlı köşeler tarafından modellenmiştir, bu nedenle üçgenlerden oluşan ilkeller yaparlar. Karşılaştırma, programın her üçgenin kenarlarını parlak beyaz bir çizgiyle oluşturmasını sağlayan bir tel kafes modunu çalıştırmamıza izin verir.

Ağaçlar, bitkiler, kayalar, zemin, dağlar - hepsi üçgenlerden oluşuyor ve her biri, ışık kaynağının konumunu dikkate alarak konumu, yönü ve rengi için hesaplandı ve kameranın konumu ve yönü. Köşelerde yapılan tüm değişikliklerin oyuna geri beslenmesi gerekir, böylece bir sonraki karenin oluşturulması için her şeyin nerede olduğunu bilir; bu, köşe arabelleğini güncelleyerek yapılır.

Şaşırtıcı bir şekilde, bu, oluşturma sürecinin zor kısmı değil ve doğru donanımla, her şey saniyenin sadece binde biri kadar bitiyor! Bir sonraki aşamaya.

Bir boyutu kaybetmek: Rasterleştirme

Tüm köşeler üzerinde çalışıldıktan ve 3D sahnemiz, her şeyin olması gerektiği yerde sonlandırıldıktan sonra, oluşturma işlemi çok önemli bir aşamaya geçer. Şimdiye kadar, oyun gerçekten 3 boyutlu oldu, ancak son kare değil - bu, görüntülenen dünyayı binlerce bağlantılı nokta içeren bir 3D alandan ayrı renkli piksellerin 2D tuvaline dönüştürmek için bir dizi değişiklik yapılması gerektiği anlamına geliyor. . Çoğu oyun için bu işlem en az iki adım içerir: ekran alanı projeksiyonu ve pikselleştirme.

Web oluşturma aracını tekrar kullanarak, dünya hacminin başlangıçta düz bir görüntüye nasıl dönüştüğünü göstermeye zorlayabiliriz. 3D sahneyi izleyen kameranın konumu en solda; bu noktadan sonra uzanan çizgiler, frustum (bir tür piramit gibi) ve frustum içindeki her şey potansiyel olarak son çerçevede görünebilir. Frustum'a küçük bir yol Görünüm, - bu aslında monitörün göstereceği şeydir ve frustum içindeki her şeyi kameranın bakış açısına göre görüntü alanına yansıtmak için bütün bir matematik yığını kullanılır.

Görünüm penceresindeki grafikler 2B görünse de, içindeki veriler hala 3B'dir ve daha sonra bu bilgiler hangi ilkellerin görünür olacağını veya çakışacağını belirlemek için kullanılır. Bunu yapmak şaşırtıcı derecede zor olabilir, çünkü bir ilkel, ilkel yapamasa bile oyunda görülebilen bir gölge oluşturabilir. İlkellerin kaldırılmasına denir itlaf ve tüm karenin ne kadar hızlı oluşturulduğu konusunda önemli bir fark yaratabilir. Tüm bunlar yapıldıktan sonra - görünür ve görünmeyen ilkelleri sıralamak, frustumun dışında kalan binning üçgenleri vb. - 3D'nin son aşaması kapanır ve çerçeve rasterleştirme yoluyla tamamen 2D olur.

Yukarıdaki görüntü, bir ilkel içeren bir çerçevenin çok basit bir örneğini göstermektedir. Çerçevenin piksellerinin oluşturduğu ızgara, alttaki şeklin kenarlarıyla karşılaştırılır ve üst üste geldikleri yerde, işlenmek üzere bir piksel işaretlenir. Gösterilen örnekte elde edilen sonuç orijinal üçgene pek benzemiyor, ancak yeterli piksel kullanmıyoruz. Bu, şu sorunla sonuçlandı: örtüşme, bununla başa çıkmanın birçok yolu olmasına rağmen. Bu yüzden çözüm Bir oyunun (çerçevede kullanılan toplam piksel sayısı) nasıl göründüğü üzerinde büyük bir etkisi vardır: pikseller sadece ilkellerin şeklini daha iyi temsil etmekle kalmaz, aynı zamanda istenmeyen takma adın etkisini de azaltır.

Oluşturma sırasının bu bölümü tamamlandığında, büyük olana bağlıdır: çerçevedeki tüm piksellerin son rengi.

Işıkları getirin: Piksel aşaması

Şimdi, render zincirindeki tüm adımların en zorluğuna geliyoruz. Yıllar önce, bu, modeldeki kıyafetlerin (dokular olarak da bilinir) piksellerdeki bilgileri (başlangıçta köşelerden) kullanarak dünyadaki nesnelere sarılmasından başka bir şey değildi. Buradaki sorun, dokular ve çerçeve 2B olsa da, bağlı oldukları dünyanın bükülmüş, taşınmış ve tepe aşamasında yeniden şekillendirilmiş olmasıdır. Bununla birlikte, bunu açıklamak için daha fazla matematik kullanılır, ancak sonuçlar bazı garip problemler yaratabilir.

Bu görüntüde, uzaklığa doğru uzanan düz bir yüzeye basit bir dama tahtası doku haritası uygulanmaktadır. Sonuç, takma adın çirkin kafasını tekrar büyütmesi ile sarsıcı bir karışıklıktır. Çözüm, doku haritalarının daha küçük sürümlerini içerir ( Eşleşme), bu dokulardan alınan verilerin tekrar tekrar kullanımı ( süzme), ve hatta Daha matematik, hepsini bir araya getirmek. Bunun etkisi oldukça belirgindir:

Bu eskiden herhangi bir oyun için gerçekten zor bir işti ama artık böyle değil, çünkü yansımalar ve gölgeler gibi diğer görsel efektlerin liberal kullanımı, dokuların işlenmesinin pikselin nispeten küçük bir parçası haline geldiği anlamına geliyor. işleme aşaması. Daha yüksek çözünürlüklerde oyun oynamak, oluşturma işleminin rasterleştirme ve piksel aşamalarında daha yüksek bir iş yükü oluşturur, ancak tepe aşamasında nispeten az etkisi vardır. Işıklar nedeniyle ilk renklendirme tepe aşamasında yapılsa da, burada daha parlak ışık efektleri de kullanılabilir.

Yukarıdaki görüntüde, üçgenler arasındaki renk değişikliklerini artık kolayca göremiyoruz, bu da bize bunun pürüzsüz, kesintisiz bir nesne olduğu izlenimini veriyor. Bu özel örnekte, küre aslında gördüğümüz aynı sayıda üçgenden oluşuyor daha önce yeşil küre ancak piksel renklendirme rutini çok daha fazla üçgene sahip olduğu izlenimini veriyor.

Birçok oyunda piksel aşamasının birkaç kez çalıştırılması gerekir. Örneğin, dünyayı yansıtan bir ayna veya göl yüzeyi, kameradan göründüğü gibi, dünyanın başlaması için işlenmiş olması gerekir. Her geçişin adı geçmek ve bir kare son görüntüyü üretmek için kolayca 4 veya daha fazla geçiş içerebilir.

Bazen, dünyayı farklı bir perspektiften yeniden çizmek ve bu görüşü oyun oyuncusu tarafından görüntülenen sahnenin bir parçası olarak kullanmak için tepe aşamasının da tekrar yapılması gerekir. Bunun için hedefleri oluştur - çerçevenin son deposu görevi gören ancak başka bir geçişte doku olarak kullanılabilen tamponlar.

Piksel aşamasının potansiyel karmaşıklığını daha iyi anlamak için okuyun Adrian Courrèges'in çerçeve analizi ve bu oyunda tek bir kare yapmak için gereken inanılmaz adımlara hayran kalacaksınız.

Çerçeve üzerindeki tüm bu çalışmaların, bitmiş bir sonuç veya geçici bir mağaza olarak bir tampona kaydedilmesi gerekir ve genel olarak, bir oyunun nihai görünüm için hareket halindeyken en az iki tamponu olacaktır: biri “iş olacak” diğeri monitörün ekrana erişmesini bekliyor veya görüntülenme aşamasında. Her zaman oluşturmak için bir çerçeve arabelleği olması gerekir, bu yüzden hepsi dolduğunda, bir şeyleri hareket ettirmek ve yeni bir tampon başlatmak için bir eylem gerçekleştirilmelidir. Bir çerçeveyi imzalamadaki son bölüm basit bir komuttur (ör. mevcut) ve bununla birlikte, son kare arabellekleri değiştirilir, monitör son oluşturulan kareyi alır ve bir sonraki kare başlatılabilir.

Bu görüntüde, Ubisoft'tan Assassin's Creed Odyssey, bitmiş bir çerçeve arabelleğinin içeriğine bakıyoruz. Sayıdan başka bir şey içermeyen satır ve sütun içeren bir elektronik tablo gibi düşünün. Bu değerler monitöre veya TV'ye bir elektrik sinyali şeklinde gönderilir ve ekran piksellerinin rengi gereken değerlere değiştirilir. CSI: TECH HABERLER'i gözlerimizle yapamadığımız için düz, sürekli bir resim görüyoruz ama beynimiz bunu derinlik - yani 3D. Oyun iyiliğinin bir çerçevesi, ancak sahne arkasında çok fazla şey varken (pardon pun), programcıların her şeyi nasıl ele aldığına bir göz atmaya değer.

Süreci yönetme: API'lar ve talimatlar

Bir oyunun tüm bu çalışmaları (matematik, köşeler, dokular, ışıklar, tamponlar, adlandırın…) nasıl gerçekleştireceğini ve yöneteceğini anlamak bir mamut görevidir. Neyse ki, ne denir şeklinde yardım var uygulama programlama Arayüzü veya kısaca API.

Oluşturma API'leri, programcıların dahil olan herhangi bir donanımdan bağımsız basitleştirilmiş talimatları kullanmalarına izin veren yapılar, kurallar ve kod kütüphaneleri sunarak genel karmaşıklığı azaltır. PC için son 3 yılda piyasaya sürülen herhangi bir 3D oyunu seçin ve üç ünlü API'dan biri kullanılarak oluşturulacak: Direct3D, OpenGL veya Vulkan. Özellikle mobil sahnede başkaları da var, ancak bu makale için bunlara sadık kalacağız.

Talimatlar ve işlemler ifadeleri açısından farklılıklar olsa da (örn. DirectX'te pikselleri işlemek için bir kod bloğu, piksel gölgelendirici; Vulkan’da parça gölgelendirici), oluşturulan çerçevenin son sonucu farklı veya daha fazla farklı olmamalıdır.

Nerede bir fark olacak tüm render yapmak için kullanılan donanım aşağı gelir. Bunun nedeni, donanımın gerçekleştirilmesi için API kullanılarak verilen talimatların çevrilmesi gerektiğidir - bu, aygıtın sürücüleri tarafından işlenir ve donanım üreticileri, sürücülerin dönüşümü olabildiğince hızlı ve doğru bir şekilde yapmalarını sağlamak için çok fazla kaynak ve zaman ayırmalıdır. mümkün.

Croteam’ın 2014 oyununun daha önceki bir beta sürümünü kullanalım Talos İlkesi bunu göstermek için, bahsettiğimiz 3 API'yi desteklediğinden. Sürücü ve arabirim kombinasyonunun bazen üretebileceği farklılıkları artırmak için, standart yerleşik karşılaştırmayı 1080p çözünürlükte maksimum görsel ayarlarda çalıştırdık. Kullanılan bilgisayar varsayılan saatlerde çalıştırıldı ve bir Intel Core i7-9700K, Nvidia Titan X (Pascal) ve 32 GB DDR4 RAM'e sahipti.

  • DirectX 9 = ortalama 188,4 fps
  • DirectX 11 = ortalama 202,3 fps
  • OpenGL = ortalama 87,9 fps
  • Vulkan = ortalama 189,4 fps

Bu rakamların ardındaki çıkarımların tam bir analizi bu makalenin amacı dahilinde değildir ve kesinlikle bir API'nın diğerinden 'daha iyi' olduğu anlamına gelmez (bu bir beta sürümüdür, unutma), bu yüzden ' Farklı API'lar için programlamanın çeşitli zorluklar sunduğuna ve şu an için performansta her zaman bir miktar değişiklik olacağına dikkat çeker. Genel olarak, oyun geliştiricileri en çok çalıştıkları API'yı seçecek ve kodlarını bu temelde optimize edeceklerdir. Bazen kelime motor oluşturma kodunu tanımlamak için kullanılır, ancak teknik olarak bir motor, sadece grafiklerini değil, bir oyundaki tüm yönleri ele alan tam pakettir.

3D oyun oluşturmak için sıfırdan eksiksiz bir program oluşturmak basit bir şey değildir, bu yüzden bugün birçok oyun diğer geliştiricilerin tam sistemlerini lisanslıyor (ör. Gerçekdışı Motor); için açık kaynak motorunu görüntüleyerek ölçek hakkında bir fikir edinebilirsiniz. id Yazılım Depremi ve gl_draw.c dosyasına göz atın - bu tek öğe oyunda gerçekleştirilen çeşitli oluşturma işlemleriyle ilgili talimatları içerir ve tüm motorun sadece küçük bir bölümünü temsil eder. Deprem 20 yaşın üzerindedir ve tüm oyun (tüm öğeler, sesler, müzik, vb. dahil) 55 MB boyutundadır; aksine, Ubisoft Far Cry 5 tutar sadece oyun tarafından 62 MB boyutunda bir dosyada kullanılan gölgelendiriciler.

Zaman her şeydir: Doğru donanımı kullanmak

Şimdiye kadar tarif ettiğimiz her şey, herhangi bir bilgisayar sisteminin CPU'su tarafından hesaplanabilir ve işlenebilir; modern x86-64 işlemciler gereken tüm matematiği kolayca destekler ve bu tür şeyler için bunlara ayrılmış parçalar bulunur. Bununla birlikte, bu işi bir çerçeve oluşturmak için yapmak çok sayıda tekrarlı hesaplama gerektirir ve önemli miktarda paralel işleme gerektirir. CPU'lar bunun için tasarlanmamıştır, çünkü gerekli tasarım gereği çok geneldir. Bu tür işler için özel yongalar elbette denir GPU'lar (grafik işlem birimleri) ve DirectX, OpenGL ve Vulkan gibi matematikte çok hızlı ve büyük ölçüde paralel bir şekilde ihtiyaç duyulan matematiği yapmak için üretilmiştir.

Bunu göstermenin bir yolu, bir CPU kullanarak bir çerçeve oluşturmamıza ve daha sonra özel donanım kullanmamıza izin veren bir ölçüt kullanmaktır. Kullanacağız V-ışını İLERİ Chaos Group tarafından; bu araç aslında bu makalede baktığımız render işleminden ziyade ışın izleme yapıyor, ancak sayı sıkışmalarının çoğu benzer donanım yönleri gerektiriyor.

Bir CPU'nun yapabileceği ve doğru, özel olarak tasarlanmış donanımın başarabileceği arasındaki farkı anlamak için V-ışını GPU karşılaştırmasını 3 modda çalıştırdık: sadece CPU, yalnızca GPU ve ardından CPU + GPU. Sonuçlar oldukça farklıdır:

  • Yalnızca CPU testi = 53 math
  • Yalnızca GPU testi = 251 math
  • CPU + GPU testi = 299 mpath

Çıktıdaki 5x'lik bir fark önemsiz bir konu olmadığından, bu kıyaslamadaki ölçüm birimlerini göz ardı edebiliriz. Ancak bu çok oyun benzeri bir test değil, bu yüzden başka bir şey deneyelim ve biraz eski okula gidelim Futuremark’ın 3DMark03. Basit Wings of Fury testini uygulayarak, CPU kullanarak tüm köşe gölgelendiricilerini (yani hareket etmek ve renk üçgenleri yapmak için yapılan tüm rutinleri) yapmaya zorlayabiliriz.

Sonuç gerçekten sürpriz olmamalı, ancak yine de V-ışını testinde gördüğümüzden çok daha belirgindir:

  • CPU tepe gölgelendiricileri = ortalama 77 fps
  • GPU köşe gölgelendiricileri = ortalama 1580 fps

CPU, tüm köşe hesaplamalarını gerçekleştirirken, her bir karenin görüntülenmesi ve görüntülenmesi ortalama 13 milisaniye sürüyordu; bu matematiği GPU'ya itmek bu zamanı 0,6 milisaniyeye düşürür. Başka bir deyişle, 20 kat daha hızlıydı.

Kıyaslamada en karmaşık testi, Doğa Ana'yı denersek, fark daha da belirgindir. CPU ile işlenmiş tepe gölgelendiricileri ile ortalama sonuç 3.1 fps değerinde bir sonuçtu! GPU'yu getirin ve ortalama kare hızı 1388 fps'ye yükselir: yaklaşık 450 kat daha hızlı. Şimdi 3DMark03'ün 16 yaşında olduğunu ve testin yalnızca CPU'daki köşeleri işlediğini unutmayın - rasterleştirme ve piksel aşaması hala GPU üzerinden yapıldı. Modern olsaydı ve her şey yazılımda yapsaydı nasıl olurdu?

Hadi deneyelim Unigine Vadisi kıyaslama aracı tekrar - nispeten yeni, işlediği grafikler Ubisoft’un Far Cry 5 gibi oyunlarda görülenlere çok benziyor; standart DirectX 11 GPU yoluna ek olarak tam bir yazılım tabanlı oluşturucu da sağlar. Sonuçlar çok fazla analiz gerektirmez, ancak GPU'da DirectX 11 testinin en düşük kaliteli sürümünü çalıştırmak saniyede 196 kare ortalama bir sonuç verdi. Yazılım sürümü? Birkaç çökme bir yana, güçlü test bilgisayarı saniyede ortalama 0,1 kare çekiyor - neredeyse iki bin kat daha yavaş.

Böyle bir farkın nedeni, 3B oluşturmanın kullandığı matematik ve veri biçiminde yatmaktadır. Bir CPU'da, kayan nokta birimleri (FPU'lar) her çekirdek içindeki hesaplamaları yapar; test PC'sinin i7-9700K modelinde her biri iki FPU bulunan 8 çekirdek bulunur. Titan X'teki birimler tasarım bakımından farklı olsa da, her ikisi de aynı temel matematiği aynı veri formatında yapabilir. Bu belirli GPU'nun karşılaştırılabilir bir hesaplama yapmak için 3500'den fazla birimi vardır ve CPU ile aynı yere (1.5 GHz vs 4.7 GHz) yakın bir yerde saat gösterilmemelerine rağmen, GPU, merkezi işlemciyi şeffaf birim sayısı ile geride bırakır.

Titan X genel bir grafik kartı olmasa da, bir bütçe modeli bile herhangi bir CPU'dan daha iyi performans gösterir, bu nedenle tüm 3D oyunlar ve API'lar özel, özel donanım için tasarlanmıştır. İndirmek için çekinmeyin V-ışını, 3DMarkveya hiç Unigine kıyaslamave kendi sisteminizi test edin - sonuçları forumda yayınlayın, böylece oyunlarda grafik oluşturmak için GPU'ların ne kadar iyi olduğunu görebilirsiniz.

101 sayfamızdaki bazı son kelimeler

Bu, 3B oyundaki bir karenin nasıl oluşturulduğuna, uzaydaki noktalardan bir monitördeki renkli piksele kadar kısa bir çalışma oldu.

En temel düzeyinde, tüm süreç sayılarla çalışmaktan başka bir şey değildir, çünkü hepsi bilgisayar yine de yapar. Bununla birlikte, bu makalede, temellere odaklanması için çok şey bırakılmıştır (muhtemelen daha sonra bilgisayar grafiklerinin nasıl yapıldığına dair daha derin dalışlarla devam edeceğiz). Kök ve piksel gölgelendiricileri tarafından gerçekleştirilen Öklid lineer cebiri, trigonometri ve diferansiyel hesap gibi kullanılan gerçek matematiğin hiçbirini dahil etmedik; dokuların istatistiksel örnekleme yoluyla nasıl işlendiğini açıkladık ve ekran alanı ortam tıkanıklığı, ışın izinin gürültüsünü giderme, yüksek dinamik aralık görüntüleme veya geçici kenar yumuşatma gibi harika görsel efektleri bir kenara bıraktık.

Ancak bir sonraki Call of Mario: Deathduty Battleyard'ı ateşlediğinizde, grafikleri sadece yeni bir merak duygusu ile görmekle kalmayacak, aynı zamanda daha fazlasını öğrenmek için kaşınacaksınız.