3D oyun oluşturmaya daha derinlemesine baktığımız bu üçüncü bölümde, köşe işleme tamamlandıktan ve sahne rasterleştirildikten sonra 3D dünyasına ne olabileceğine odaklanacağız. Yapılandırma, gerçekleşen her şey renkli blokların iki boyutlu bir ızgarasının renkleri hesaplansa ve değiştirilse de, renderlemede en önemli aşamalardan biridir.

Bugün oyunlarda görülen görsel efektlerin çoğu, dokuların akıllıca kullanılmasına bağlıdır - onlarsız oyunlar donuk ve cansız olur. Öyleyse dalmaya gidelim ve bunların nasıl çalıştığını görelim!

Her zaman olduğu gibi, dokuya derin bir dalış yapmaya hazır değilseniz, panik yapmayın - başlayabilirsiniz 3D Oyun Oluşturma 101. Ancak temelleri geçtikten sonra, 3D grafik dünyasına bir sonraki bakışımız için okumaya devam edin.

Basit başlayalım

Son 12 aydaki en çok satan 3D oyunlarını seçin ve hepsi ortak bir şeyi paylaşacak: doku haritaları (ya da sadece dokular). Bu, öylesine yaygın bir terimdir: dokuları düşünürken çoğu insan aynı görüntüyü çekecektir: bir yüzeyin resmini içeren basit, düz bir kare veya dikdörtgen (çim, taş, metal, kıyafet, yüz, vb.).

Ancak çoklu katmanlarda kullanıldığında ve karmaşık aritmetik kullanılarak bir araya getirildiğinde, bu temel resimlerin 3D sahnede kullanılması şaşırtıcı derecede gerçekçi görüntüler üretebilir. Bunun nasıl mümkün olduğunu görmek için, onları tamamen atlayarak ve 3D dünyasındaki nesnelerin onlarsız nasıl görünebileceğini görmeye başlayalım.

Önceki makalelerde gördüğümüz gibi, 3D dünyası köşelerden oluşuyor - hareket ettirilen ve daha sonra renklendirilen basit şekiller. Bunlar daha sonra ilkelleri yapmak için kullanılır ve bunlar da 2B piksel ızgarasına sıkıştırılır. Dokuları kullanmayacağımızdan, bu piksellerde renklendirmemiz gerekiyor.

Kullanılabilecek bir yöntem denir düz gölgeleme, ilkel maddenin ilk tepe noktasının rengini almayı ve ardından bu rengi, rasterdeki şeklin kapsamına giren tüm pikseller için kullanmayı içerir. Şuna benziyor:

Açıkçası bu gerçekçi bir çaydanlık değildir, en azından yüzey rengi yanlıştır. Renkler bir seviyeden diğerine atlıyor, yumuşak bir geçiş yok. Bu soruna bir çözüm olarak adlandırılan bir şey kullanmak olabilir Gouraud gölgeleme.

Bu, köşelerin renklerini alan ve üçgenin yüzeyi boyunca rengin nasıl değiştiğini hesaplayan bir işlemdir. Kullanılan matematik doğrusal enterpolasyonbu süslü gibi görünür, ancak gerçekte, ilkel bir tarafın rengi 0.2 kırmızı, diğer tarafı 0.8 kırmızı ise, şeklin ortası 0.2 ila 0.8 arasında bir renge sahipse (yani 0.5).

Yapması nispeten basittir ve asıl yararı, hız anlamına gelir. Birçok erken 3D oyun bu tekniği kullandı, çünkü hesaplamaları yapan donanım yapabildikleriyle sınırlıydı.

Ancak bunun bile sorunları var, çünkü bir ışık bir üçgenin tam ortasını gösteriyorsa, köşeleri (köşeleri) bunu düzgün şekilde yakalayamayabilir. Bu, ışığın neden olduğu vurguların tamamen kaçırılabileceği anlamına gelir.

Düz ve Gouraud gölgelendirmesi, render cephanesinde yer alırken, yukarıdaki örnekler, onları iyileştirmek için dokuların kullanımı için açık adaylardır. Ve bir doku bir yüzeye uygulandığında ne olduğunu iyi anlamak için, zaman içinde geri döneceğiz ... 1996'ya kadar.

Kısa bir oyun ve GPU geçmişi

Quake 23 yıl önce piyasaya sürülen bir dönüm noktası oyunu id Yazılım. Ortamı oluşturmak için 3D çokgenleri ve dokuları kullanan ilk oyun olmasa da, hepsini çok etkili bir şekilde kullanan ilk oyunlardan biriydi.

Yaptığı başka bir şey, OpenGL ile neler yapılabileceğini sergilemekti (grafik API'si hala ilk revizyonundaydı) ve aynı zamanda ilk grafik kartı ürününün satışına yardımcı olmak için çok uzun bir yol kat etti. Yorum Verite ve 3Dfx Vudu.

Bugünün standartlarıyla karşılaştırıldığında, Voodoo son derece basitti: 2D grafik desteği yok, köşe işleme yok ve sadece piksel işlemenin temelleri. Yine de bir güzellikti:

Bir dokudan bir piksel almak için tüm bir çipe (TMU) ve ardından rasterden bir pikselle karıştırmak için başka bir çipe (FBI) sahipti. Sis veya şeffaflık efektleri yapmak gibi birkaç ek işlem yapabilir, ancak neredeyse buydu.

Grafik kartının tasarımı ve çalışmasının arkasındaki mimariye genel bir bakış yaparsak, bu işlemlerin nasıl çalıştığını görebiliriz.

FBI yongası iki renk değeri alır ve bunları bir araya getirir; bunlardan biri bir dokudan bir değer olabilir. Harmanlama işlemi matematiksel olarak oldukça basittir, ancak tam olarak karıştırılmakta olan ile talimatların yürütülmesi için hangi API'nın kullanıldığı arasında biraz farklılık gösterir.

Neye bakarsak Direct3D teklifleri harmanlama fonksiyonları ve harmanlama işlemleri açısından, her pikselin önce 0.0 ile 1.0 arasında bir sayı ile çarpıldığını görebiliriz. Bu, pikselin renginin ne kadarının son görünümü etkileyeceğini belirler. Daha sonra ayarlanan iki piksel rengi eklenir, çıkarılır veya çoğaltılır; bazı işlevlerde, işlem her zaman en parlak piksel gibi bir şeyin seçildiği bir mantık ifadesidir.

Yukarıdaki görüntü bunun pratikte nasıl çalıştığına bir örnektir; sol piksel için kullanılan faktörün pikselin alfa değer. Bu sayı, şeffaf piksel.

Aşamaların geri kalanı bir sis değerinin uygulanmasını içerir (programcı tarafından oluşturulan bir sayı tablosundan alınır, sonra aynı karıştırma matematiğini yapar); bazı görünürlük ve şeffaflık kontrolleri ve ayarlamaları yapmak; sonunda pikselin rengini grafik kartındaki belleğe yazmadan önce.

Neden tarih dersi? Tasarımın göreceli sadeliğine rağmen (özellikle modern devlerinkine kıyasla), süreç dokulamanın temel temellerini açıklar: bazı renk değerleri elde edin ve bunları karıştırın, böylece modeller ve ortamlar belirli bir durumda nasıl olması gerektiğine bakarlar .

Bugünün oyunları hala tüm bunları yapıyor, tek fark kullanılan doku miktarı ve karıştırma hesaplamalarının karmaşıklığı. Birlikte, filmlerde görülen görsel efektleri veya ışığın farklı malzemeler ve yüzeylerle nasıl etkileştiğini simüle ederler.

Tekstüre etmenin temelleri

Bizim için bir doku, görüntülenen çerçevedeki 3B yapıları oluşturan çokgenlere uygulanan düz, 2B bir resimdir. Bir bilgisayar için, bir 2D dizi şeklinde küçük bir bellek bloğundan başka bir şey değildir. Dizideki her giriş, doku görüntüsündeki piksellerden biri için bir renk değerini temsil eder (daha iyi bilinir) tekstiller - doku pikselleri).

Bir çokgendeki her tepe noktasının 2 koordinatı vardır (genellikle sen, v), dokudaki hangi pikselin kendisiyle ilişkilendirildiğini anlatır. Köşenin kendileri 3 koordinat kümesine sahiptir (x, y, z) ve metinleri köşelere bağlama işlemine denir. doku eşleme.

Bunu çalışırken görmek için, bu makale dizisinde birkaç kez kullandığımız bir araca dönelim: Gerçek Zamanlı Oluşturma WebGL aracı. Şimdilik, z köşelerden koordine edin ve her şeyi düz bir düzlemde tutun.

Soldan sağa, dokuya sahibiz sen, v doğrudan köşe köşelerine eşlenen koordinatlar x, y koordinatlar. Sonra üst köşeler y koordinatları arttı, ancak doku hala doğrudan onlara eşlendiğinden, doku yukarı doğru gerilir. En sağdaki resimde, bu sefer değişen doku: u değerler yükselmiştir ancak bu, dokunun ezilmesine ve daha sonra tekrarlanmasına neden olmaktadır.

Çünkü doku artık etkili bir şekilde daha uzun olmasına rağmen, daha yüksek u değer, hala ilkel içine sığmalıdır - esas olarak doku kısmen tekrarlanmıştır. Bu, birçok 3D oyunda görülen bir şeyi yapmanın bir yoludur: ttekrarlamak. Bunun yaygın örnekleri kayalık veya çimenlik manzaralara veya tuğla duvarlara sahip sahnelerde bulunabilir.

Şimdi sahneyi daha fazla ilkel olacak şekilde ayarlayalım ve derinliği tekrar oyuna sokacağız. Aşağıda sahip olduğumuz şey klasik bir manzara görünümüdür, ancak sandık dokusu ilkeller arasında kopyalandığı ve tekrarlandığı gibi.

Şimdi bu sandık dokusu, orijinal gif formatında 66 kilo büyüklüğünde ve 256 x 256 piksel çözünürlüğe sahip. Çerçevenin, sandık dokularının kapladığı kısmının orijinal çözünürlüğü 1900 x 680'dir, bu yüzden sadece piksel 'alanı' açısından bu bölge sadece 20 sandık dokusunu görüntüleyebilmelidir.

Açıkça 20'den fazla yol alıyoruz, bu yüzden arka plandaki birçok sandık dokusunun çok 256 x 256 pikselden daha küçük. Gerçekten de öyleler ve bir süreçten geçtiler doku küçültme (evet, bu bir kelime!). Şimdi tekrar deneyelim, ama bu sefer sandıklardan birine yakınlaştı.

Dokunun sadece 256 x 256 piksel boyutunda olduğunu unutmayın, ancak burada bir dokunun 1900 piksel genişliğindeki resmin genişliğinin yarısından fazlasını olduğunu görebiliriz. Bu doku denilen bir şeyden geçti doku büyütme.

Bu iki doku süreci her zaman 3B oyunlarda gerçekleşir, çünkü kamera sahne etrafında hareket ederken veya modeller yaklaştıkça ve uzaklaştıkça, ilkellere uygulanan tüm dokuların çokgenlerle birlikte ölçeklendirilmesi gerekir. Matematiksel olarak, bu büyük bir mesele değil, aslında, en basit entegre grafik yongaları bile böyle bir işte yanıp sönüyor. Bununla birlikte, doku küçültme ve büyütme bir şekilde çözülmesi gereken yeni problemler ortaya koymaktadır.

Mini dokuları girin

Düzeltilmesi gereken ilk konu uzaktaki dokular içindir. İlk sandık manzara görüntüsüne tekrar bakarsak, ufukta doğru olanlar sadece birkaç piksel boyutundadır. 256 x 256 piksel boyutundaki bir görüntüyü böyle küçük bir alana sıkıştırmaya çalışmak iki nedenden dolayı anlamsızdır.

Birincisi, daha küçük bir doku, grafik kartında daha az bellek alanı kaplar ve bu da az miktarda önbelleğe sığdırmaya çalışmak için kullanışlıdır. Bu, önbellekten kaldırılmasının daha az olası olduğu ve bu dokunun tekrar tekrar kullanılması, yakındaki bellekte olan verilerin tam performans avantajını elde edeceği anlamına gelir. Yakınlaştırılmış dokular için aynı soruna bağlı olduğu için bir anlığına gelmemizin ikinci nedeni.

Küçük ilkellerde ezilen büyük dokuların kullanımına ortak bir çözüm, Eşleşme. Bunlar orijinal dokunun küçültülmüş versiyonlarıdır; oyun motorunun kendisi oluşturulabilir (bunları yapmak için ilgili API komutunu kullanarak) veya oyun tasarımcıları tarafından önceden yapılabilir. Her mipmap doku düzeyi bir öncekinin doğrusal boyutlarının yarısına sahiptir.

Sandık dokusu için şöyle bir şey olur: 256 x 256 → 128 x 128 → 64 x 64 → 32 x 32 → 16 x 16 → 8 x 8 → 4 x 4 → 2 x 2 → 1 x 1.

Mipmap'lerin hepsi birlikte paketlenir, böylece doku hala aynı dosya adıdır, ancak şimdi daha büyüktür. Doku öyle bir şekilde paketlenmiştir ki sen, v koordinatları sadece çerçevedeki bir piksele hangi texelin uygulanacağını belirlemekle kalmaz, aynı zamanda hangi mipmap'tan da uygulanır. Programcılar daha sonra oluşturucuyu, kare pikselinin derinlik değerine göre kullanılacak mipmap'i belirlemek için kodlar, yani çok yüksekse, piksel uzak mesafededir, böylece küçük bir mipmap kullanılabilir.

Keskin gözlü okuyucular mipmap'lerin dezavantajını görmüş olabilirler ve dokuların daha büyük olması pahasına gelir. Orijinal sandık dokusu 256 x 256 piksel boyutundadır, ancak yukarıdaki resimde de görebileceğiniz gibi, mipmap'lı doku artık 384 x 256'dır. Evet, çok fazla boş alan var, ancak daha küçük dokularda nasıl paketlediğinize bakılmaksızın , dokunun boyutlarından en az birine yapılan toplam artış% 50'dir.

Ancak bu sadece önceden hazırlanmış mipmap'ler için geçerlidir; oyun motoru bunları gerektiği gibi üretecek şekilde programlanmışsa, artış orijinal doku boyutundan asla% 33'ten fazla olamaz. Böylece doku mipmap'larındaki bellekte nispeten küçük bir artış için performans avantajları ve görsel iyileştirmeler elde edersiniz.

Aşağıda doku mipmap'lerinin kapalı / açık karşılaştırması verilmiştir:

Görüntünün sol tarafında, sandık dokuları 'olduğu gibi' kullanılıyor, bu da grenli bir görünüme neden oluyor ve sözde hareli desenleri uzakta. Oysa sağ tarafta, mipmap'lerin kullanımı, sandık dokusunun ufukta tutarlı bir renge dönüştüğü manzara boyunca çok daha yumuşak bir geçişe neden olur.

Ancak, en sevdikleri oyunun arka planını bozan bulanık dokular isteyen var mı?

Bilineer, üç çizgili, anizotropik - hepsi benim için Yunanca

Bir çerçevedeki bir piksele uygulanacak bir dokudan piksel seçme işlemine denir doku örneklemeve mükemmel bir dünyada, boyutuna, konumuna, yönüne vb. bakılmaksızın, ilkeline tam olarak uyan bir doku olurdu. Başka bir deyişle, doku örneklemesi, 1'e 1 düz bir pikselden piksele eşleme işleminden başka bir şey değildir.

Durum böyle olmadığından, doku örneklemesinin bir dizi faktörü hesaba katması gerekir:

  • Doku büyütülmüş veya küçültülmüş mü?
  • Doku orijinal mi yoksa bir mipmap mı?
  • Doku hangi açıda gösteriliyor?

Bunları birer birer analiz edelim. Birincisi yeterince açık: doku büyütülmüşse, ilkeldeki pikseli gereğinden fazla örten daha fazla metin olacaktır; küçültme ile bunun tersi olacaktır, her bir texel artık birden fazla pikseli kapsamalıdır. Bu biraz sorun.

İkincisi, mipmaplar uzaktaki ilkellerle doku örnekleme sorununu çözmek için kullanıldığından, dokuları bir açıda bırakır. Ve evet, bu da bir problem. Neden? Tüm dokular, bir görünüm için 'yüz açık' olarak oluşturulan veya hepsi matematik benzeri olduğu için: doku yüzeyinin normali, dokunun üzerinde görüntülenmekte olan yüzeyin normaliyle aynıdır.

Bu nedenle, çok az veya çok fazla tekstüre sahip olmak ve bir açıda tekstüre sahip olmak, doku filtreleme. Bu işlemi kullanmazsanız, elde ettiğiniz şey budur:

Burada, doku filtrelemeden ne kadar karışıklık yaşayacağını daha net bir şekilde göstermek için sandık dokusunu bir R harfi dokusu ile değiştirdik!

Direct3D, OpenGL ve Vulkan gibi grafik API'lerinin tümü aynı aralık filtreleme türlerini sunar, ancak bunlar için farklı adlar kullanır. Aslında, hepsi böyle gidiyor:

  • En yakın nokta örneklemesi
  • Doğrusal doku filtreleme
  • Anizotropik doku filtreleme

Tüm niyet ve amaçlara, en yakın nokta örneklemesi filtreleme yapmıyorsa - bunun nedeni, dokuların örneklenmesi (yani bellekten kopyalanması) ve daha sonra pikselin orijinal rengiyle harmanlanmasını gerektiren piksele en yakın piksel olmasıdır.

İşte kurtarmaya doğrusal filtreleme geliyor. Gerekli olan sen, v texel koordinatları örnekleme için donanıma gönderilir, ancak bu koordinatlara en yakın texeli almak yerine, örnekleyici dört teksel. Bunlar, en yakın nokta örneklemesi kullanılarak seçilenin doğrudan üstünde, altında, solunda ve sağındadır.

Bu 4 tekstiller daha sonra ağırlıklı bir formül kullanılarak karıştırılır. Örneğin Vulkan'da formül:

T "Renk", f Süzülmüş olan için ve 1 ila 4 arasında dört örneklenmiş metin vardır. Değerleri alfa ve beta tarafından tanımlanan noktadan ne kadar uzakta sen, v koordinatlar dokunun ortasından gelir.

Neyse ki, 3D oyunlara katılan herkes için, onları oynamak ya da yapmak, bu grafik işleme çipinde otomatik olarak olur. Aslında, 3dfx Voodoo'daki TMU yongası bunu yaptı: 4 tekil örnekledi ve sonra bunları karıştırdı. Direct3D bunu garip bir şekilde çağırıyor bilinear filtreleme, ancak Quake ve Voodoo'nun TMU çipi zamanından bu yana, grafik kartları sadece bir saat döngüsünde bilinear filtreleme yapabiliyordu (doku elbette yakın hafızada rahatça oturuyorsa).

Doğrusal filtreleme, mipmap'ların yanında kullanılabilir ve filtrelemenizle gerçekten süslü olmak istiyorsanız, bir dokudan 4 metin, daha sonra bir sonraki mipmap seviyesinden başka bir 4 tane alabilir ve daha sonra bunları birleştirebilirsiniz. Ve bunun için Direct3D'nin adı? üç çizgili filtreleme. ne var tri bu süreç hakkında? Tahmininiz bizimki kadar iyi ...

Bahsedilen son filtreleme yöntemi denir anizotrop. Bu aslında bilinear veya trilinear filtrelemede yapılan işleme göre bir ayarlamadır. Başlangıçta anizotropi derecesi ilkel yüzeyin (ve şaşırtıcı derecede karmaşık) - bu değer, ilkelin en boy oranını, yönlendirmesi nedeniyle değiştirir:

Yukarıdaki görüntü, eşit uzunlukta kenarlara sahip aynı kare ilkeli göstermektedir; ancak perspektifimizden uzaklaştıkça, kare bir dikdörtgen gibi görünüyor ve genişliği yüksekliğinin üzerine çıkıyor. Sağdaki ilkel, soldakinden daha büyük bir anizotropiye sahiptir (ve kare durumunda, derece tam olarak sıfırdır).

Bugünün 3D oyunlarının çoğu, anizotropik filtrelemeyi etkinleştirmenize ve ardından düzeyini ayarlamanıza izin verir (1x ila 16x), ancak bu aslında ne değişir? Ayar, orijinal doğrusal örnekleme başına alınan maksimum ek texel örneği sayısını kontrol eder. Örneğin, oyunun 8x anizotropik bilinear filtreleme kullanacak şekilde ayarlandığını varsayalım. Bu, sadece 4 metin değerini almak yerine 32 değeri getireceği anlamına gelir.

Anizotropik filtrelemenin kullanımının fark edebileceği açıktır:

Sadece biraz yukarı kaydırın ve maksimum 16x anizotropik trilinear filtreleme için en yakın nokta örneklemesini karşılaştırın. Çok pürüzsüz, neredeyse lezzetli!

Ancak tüm bu güzel tereyağı doku lezzetini ödemek için bir fiyat olmalı ve kesinlikle performans: tüm maksimum, anizotropik trilinear filtreleme, oluşturulan her piksel için bir dokudan 128 örnek getirecek. En yeni GPU'ların en iyileri için bile, bu tek bir saat döngüsünde yapılamaz.

AMD gibi bir şey alırsak Radeon RX 5700 XT, işlemcinin içindeki doku birimlerinin her biri bir saat döngüsünde 32 texel adresini kapatabilir, daha sonra başka bir saat döngüsünde bellekten (her biri 32 bit boyutunda) 32 texel yükleyebilir ve daha sonra 4 tanesini bir araya getirebilir işaretleyin. Yani, tek bir harmanlanmış 128 texel örneği için, bu en az 16 saat çevrimi gerektirir.

Şimdi 5700 XT'nin temel saat hızı 1605 MHz'dir, bu nedenle on altı döngü sadece 10 alır nanosaniye. Bunu 4K çerçevesindeki her piksel için sadece bir doku birimi, hala sadece 70 milisaniye sürecekti. Tamam, belki de performans o kadar da önemli değil!

1996 yılında bile, 3Dfx Voodoo'nun beğenileri dokuları ele alma konusunda oldukça şıktı. Saat döngüsü başına 1 bilinear filtrelenmiş texelde maksimum verilebilir ve TMU çipi 50 MHz'de sallanırken, her saniye 50 milyon texin kesilebileceği anlamına geliyordu. 800 x 600 ve 30 fps hızında çalışan bir oyunda saniyede sadece 14 milyon bilinear filtreli metin gerekir.

Bununla birlikte, tüm bunlar dokuların yakındaki bellekte olduğunu ve her piksele yalnızca bir texin eşlendiğini varsayar. Yirmi yıl önce, bir ilkeye birden fazla doku uygulamak zorunda kalma fikri neredeyse tamamen yabancıydı, ancak şimdi sıradan. Bu değişikliğin neden gerçekleştiğine bakalım.

Muhteşem görüntülere giden yolu aydınlatma

Dokumanın nasıl bu kadar önemli hale geldiğini anlamaya yardımcı olmak için bu sahneye Quake'den bir göz atın:

Bu karanlık bir görüntü, bu oyunun doğasıydı, ama karanlığın her yerde aynı olmadığını görebilirsiniz - o bölgedeki genel aydınlatma hissi vermek için duvarların ve zeminin yamaları diğerlerinden daha parlak.

Yanları ve zemini oluşturan ilkeller, kendilerine uygulanan aynı dokuya sahiptir, ancak adı verilen ikinci bir doku vardır. ışık haritası, kare pikselleriyle eşleştirilmeden önce texel değerleriyle harmanlanır. Quake günlerinde, ışık haritaları oyun motoru tarafından önceden hesaplandı ve yapıldı ve statik ve dinamik ışık seviyeleri oluşturmak için kullanıldı.

Bunları kullanmanın avantajı, köşelerden ziyade dokulara karmaşık aydınlatma hesaplamaları yapılması, özellikle bir sahnenin görünümünü iyileştirmesi ve çok az performans maliyeti olmasıydı. Açıkçası mükemmel değil: zeminde görebileceğiniz gibi, aydınlatılmış alanlar ve gölgedekiler arasındaki sınır çok sade.

Birçok yönden, hafif bir harita sadece başka bir dokudır (hepsinin 2D veri dizilerinden başka bir şey olmadığını unutmayın), bu yüzden burada baktığımız şey, olarak bilinen şeyin erken kullanımıdır. çoklu doku. Adından da anlaşılacağı gibi, bir ilkeye iki veya daha fazla dokunun uygulandığı bir süreçtir. Quake'te hafif haritaların kullanılması, Gouraud gölgelendirmesinin sınırlamalarının üstesinden gelmek için bir çözümdü, ancak grafik kartlarının yetenekleri büyüdükçe, çok-çekişli uygulamalar da büyüdü.

3Dfx Voodoo, çağının diğer kartları gibi, bir renderde ne kadar yapabileceğiyle sınırlıydı geçmek. Bu esasen tam bir oluşturma dizisidir: köşeleri işlemekten çerçeveyi rasterlemeye ve ardından pikselleri son bir çerçeve arabelleğine değiştirmeye. Yirmi yıl önce, oyunlar hemen hemen her zaman tek geçiş gerçekleştirdi.

Bunun nedeni, köşeleri iki kez işlemek, sadece biraz daha fazla doku uygulamak istediğiniz için, performans açısından çok maliyetli olmasıydı. Voodoo'dan birkaç yıl sonra, ATI Radeon ve Nvidia GeForce 2 ekran kartlarının tek renderleme geçişinde multitexturing yapabilmesi için mevcut olana kadar beklemek zorunda kaldık.

Bu GPU'lar, piksel işleme bölümü başına birden fazla doku birimine sahipti (diğer bir deyişle, boru hattı), böylece iki ayrı dokudan bilinear filtrelenmiş bir texel getirmek bir cinch oldu. Bu, ışık eşlemesini daha da popüler hale getirdi ve oyunların onları tamamen dinamik hale getirerek oyunun ortamındaki değişikliklere göre ışık değerlerini değiştirdi.

Ancak birden fazla doku ile yapılabilecek çok daha fazlası var, bu yüzden bir göz atalım.

Yüksekliği çarpmak normaldir

3B oluşturmayla ilgili bu makale dizisinde, GPU'nun rolünün gerçekten tüm mesele nasıl uyduğunu ele almadık (henüz yapacağız, henüz değil!). Ama eğer geri dönersen Bölüm 1ve köşe işlemeyle ilgili tüm karmaşık çalışmalara bakın, bunun grafik işlemcinin işlemesi için tüm dizinin en zor kısmı olduğunu düşünebilirsiniz.

Uzun zamandır öyleydi ve oyun programcıları bu iş yükünü azaltmak için ellerinden geleni yaptılar. Bu, görsel hileler çantasına ulaşmak ve mümkün olduğunca çok kısayol ve hileyi çıkarmak anlamına geliyordu, her yerde çok sayıda köşe kullanmanın aynı görsel görünümünü vermek, ama aslında bunu başlatmak için pek çoğunu kullanmamaktı.

Ve bu hilelerin çoğu, yükseklik haritaları ve normal haritalar. İkisi, ikincisinin birinciden yaratılabileceği ile ilgilidir, ancak şimdilik, sadece şu adı verilen bir tekniğe bakalım: yumru haritalama.

Yumru haritalama, orijinal dokunun garip bir versiyonuna benzeyen yükseklik haritası adı verilen bir 2D dizi kullanılmasını içerir. Örneğin, yukarıdaki görüntüde, 2 düz yüzeye uygulanan gerçekçi bir tuğla dokusu vardır. Doku ve yükseklik haritası şöyle görünür:

Yükseklik haritasının renkleri tuğla yüzeyinin normallerini temsil eder (normalin ne olduğunu örtdük Bölüm 1 bu makale dizisinin). Render sekansı tuğla dokusunu yüzeye uygulama noktasına ulaştığında, tuğla dokusunun rengini normale göre ayarlamak için bir dizi hesaplama yapılır.

Sonuç olarak, tuğlalar hala tamamen düz olsalar da, daha 3D görünüyorlar. Özellikle tuğlaların kenarlarına dikkatlice bakarsanız, tekniğin sınırlarını görebilirsiniz: doku biraz bükülmüş görünüyor. Ancak, bir yüzeye daha fazla ayrıntı eklemenin hızlı bir numarası için, yumru haritalama çok popülerdir.

Normal bir harita bir yükseklik haritası gibidir, ancak o dokunun renkleri normalin kendisidir. Başka bir deyişle, yükseklik haritasını normale dönüştürmek için bir hesaplama gerekli değildir. Uzaydaki bir oku temsil etmek için renklerin nasıl kullanılabileceğini merak edebilirsiniz. Cevap basit: her bir texel belirli bir R, G, B değerleri (kırmızı, yeşil, mavi) ve bu sayılar doğrudan x, y, z normal vektör için değerler.

Yukarıdaki örnekte, sol şema normalin yönünün engebeli bir yüzeyde nasıl değiştiğini göstermektedir. Aynı normalleri düz bir dokuda (orta diyagram) temsil etmek için, onlara bir renk atarız. Bizim durumumuzda, R, G, B düz için (0,255,0) değerleri ve daha sonra sol için kırmızı ve sağ için mavi miktarlarını arttırmak.

Bu rengin orijinal pikselle harmanlanmadığına dikkat edin - işlemciye normalin hangi yöne baktığını söyler, böylece kamera, ışıklar ve dokulu yüzey arasındaki açıları doğru bir şekilde hesaplayabilir.

Sahnede dinamik aydınlatma kullanıldığında yumru ve normal eşlemenin faydaları gerçekten parlar ve oluşturma işlemi, her köşe için değil, piksel başına ışık değişikliklerinin etkilerini hesaplar. Modern oyunlar şimdi yapılan sihir kalitesini artırmak için bir yığın doku kullanıyor.

Bu gerçekçi görünümlü duvar inanılmaz derecede sadece düz bir yüzeydir - tuğla ve harç hakkındaki detaylar milyonlarca çokgen kullanılarak yapılmaz. Bunun yerine, sadece 5 doku ve çok sayıda akıllı matematik işi yapar.

Yükseklik haritası, tuğlaların kendilerine gölge oluşturma yolunu ve yüzeydeki tüm küçük değişiklikleri simüle etmek için normal haritayı üretmek için kullanıldı. Pürüzlülük dokusu, ışığın duvarın farklı elemanlarından nasıl yansıtılacağını değiştirmek için kullanıldı (örn. Düzleştirilmiş bir tuğla, kaba harçtan daha tutarlı bir şekilde yansıtır).

Yukarıdaki görüntüde AO olarak etiketlenmiş son harita, ortam tıkanıklığı adı verilen bir sürecin bir parçasını oluşturur: bu, daha sonraki bir makalede daha derinlemesine bakacağımız bir tekniktir, ancak şimdilik sadece gölgeler.

Doku eşleme çok önemlidir

Tekstüre oyun tasarımı için kesinlikle çok önemlidir. Warhorse Studio'nun 2019 sürümünü alın Krallık Geliyor: Kurtuluş - Orta Doğu Avrupa'nın eski bir ülkesi olan 15. yüzyıl Bohemya'da kurulan bir birinci şahıs RPG. Tasarımcılar, söz konusu dönemde mümkün olduğunca gerçekçi bir dünya yaratmaya hevesliydi. Ve oyuncuyu yüzlerce yıl önce bir hayata çekmenin en iyi yolu, her manzara görünümü, bina, kıyafet seti, saç, günlük ürünler vb. İçin doğru görünüme sahip olmaktı.

Oyundaki bu tek görüntüdeki her benzersiz doku, sanatçılar tarafından ve bunların programcılar tarafından kontrol edilen render motoru tarafından kullanımları tarafından yapılmıştır. Bazıları küçük, temel detaylara sahip ve diğer dokuları (örneğin tavuk kanatları) filtreleme veya işleme tabi tutma yolunda çok az şey alıyor.

Diğerleri yüksek çözünürlüklüdür ve çok sayıda ince ayrıntı gösterir; anizotropik olarak filtrelendi ve normal haritalar ve diğer dokularla harmanlandı - sadece ön plandaki adamın yüzüne bakın. Sahnedeki her öğenin tekstüre edilmesinin farklı gereklilikleri programcılar tarafından açıklanmıştır.

Tüm bunlar şimdi birçok oyunda gerçekleşiyor, çünkü oyuncular daha fazla ayrıntı ve gerçekçilik bekliyor. Dokular büyüyecek ve bir yüzeyde daha fazla kullanılacaktır, ancak metinleri örnekleme ve piksellere uygulama süreci, esasen Quake günlerindeki ile aynı olacaktır. En iyi teknoloji, ne kadar eski olursa olsun asla ölmez!