In questo terzo capitolo, in cui diamo uno sguardo più approfondito alla creazione di giochi 3D, ci concentreremo su cosa può accadere al mondo 3D dopo l'elaborazione degli angoli e la rasterizzazione delle scene. La configurazione è una delle fasi più importanti del rendering, anche se tutto ciò che accade è che i colori di una griglia bidimensionale di blocchi colorati vengono calcolati e modificati.

Molti degli effetti visivi visti oggi nei giochi dipendono dall'uso intelligente delle trame: senza di esse, i giochi sarebbero noiosi e senza vita. Quindi facciamo il grande passo e vediamo come funzionano!

Come sempre, se non sei pronto per fare un tuffo profondo nei tessuti, niente panico: puoi iniziare Creazione di giochi 3D 101. Ma una volta superate le basi, continua a leggere per il nostro prossimo sguardo al mondo della grafica 3D.

Iniziamo in modo semplice

Scegli i giochi 3D più venduti degli ultimi 12 mesi e condivideranno tutti una cosa in comune: mappe di trama (o semplicemente trame). Questo è un termine molto comune, la maggior parte delle persone creerà la stessa immagine quando pensa alle trame: un semplice quadrato o rettangolo piatto contenente l'immagine di una superficie (erba, pietra, metallo, vestiti, viso, ecc.).

Ma se utilizzate in più livelli e messe insieme utilizzando un'aritmetica complessa, l'utilizzo di queste immagini di base in una scena 3D può produrre immagini incredibilmente realistiche. Per vedere come ciò sia possibile, saltiamoli del tutto e vediamo come potrebbero apparire gli oggetti nel mondo 3D senza di essi.

Come abbiamo visto negli articoli precedenti, il mondo 3D è costituito da vertici, forme semplici che vengono spostate e poi colorate. Questi vengono quindi utilizzati per creare le primitive, che a loro volta vengono compresse in una griglia di pixel 2D. Poiché non utilizzeremo le trame, dobbiamo colorare questi pixel.



Viene chiamato un metodo che può essere utilizzato ombreggiatura piattaimplica ottenere il colore del primo vertice della primitiva e quindi utilizzare quel colore per tutti i pixel nel raster che cadono sotto la forma. Sembra così:

Ovviamente questa non è una teiera realistica, almeno il colore della superficie è sbagliato. I colori saltano da un livello all'altro, non c'è transizione graduale. Una soluzione a questo problema potrebbe essere quella di utilizzare qualcosa chiamato Ombreggiatura Gouraud.



Questa è un'operazione che prende i colori dei vertici e calcola come cambia il colore sulla superficie del triangolo. La matematica usata interpolazione lineareAnche se questo suona fantasioso, in realtà, se un lato primitivo è di colore rosso 0,2 e l'altro lato è rosso 0,8, significa che il centro della forma ha un colore compreso tra 0,2 e 0,8 (cioè 0,5).

È relativamente semplice da fare e il vantaggio principale è la velocità. Molti dei primi giochi 3D utilizzavano questa tecnica perché l'hardware che effettuava i calcoli era limitato da ciò che poteva fare.

Ma anche questo ha i suoi problemi, perché se una luce punta proprio nel mezzo di un triangolo, i suoi vertici (vertici) potrebbero non essere in grado di catturarla correttamente. Ciò significa che i punti salienti causati dalla luce possono essere completamente trascurati.

Le ombreggiature Flat e Gouraud sono nell'arsenale di rendering, mentre gli esempi sopra sono candidati chiari per l'utilizzo di trame per migliorarle. E per capire meglio cosa succede quando una texture viene applicata a una superficie, torneremo indietro nel tempo... al 1996.

Una breve storia di giochi e GPU

Quake è un gioco di riferimento uscito 23 anni fa ID Software. Sebbene non sia stato il primo gioco a utilizzare poligoni e texture 3D per creare l'ambiente, è stato uno dei primi a utilizzarli tutti in modo così efficace.

Un'altra cosa che ha fatto è stata mostrare cosa si poteva fare con OpenGL (l'API grafica era ancora alla sua prima revisione), e ha anche aiutato molto a vendere il primo prodotto di scheda grafica. Commento ve 3Dfx Vudu.

Rispetto agli standard odierni, Voodoo era estremamente semplice: nessun supporto per la grafica 2D, nessun rendering dei vertici e solo le basi del rendering dei pixel. Era pur sempre una bellezza:

Aveva un intero chip (TMU) per ottenere un pixel da una trama e poi un altro chip (FBI) per mescolarlo con un pixel dal raster. Potrebbe fare alcuni extra come creare effetti di nebbia o trasparenza, ma era praticamente tutto.

Se diamo una panoramica dell'architettura alla base del design e del funzionamento della scheda grafica, possiamo vedere come funzionano questi processi.

Il chip dell'FBI prende due valori di colore e li combina; uno di questi può essere un valore da una trama. Il processo di confronto è matematicamente abbastanza semplice, ma differisce leggermente tra ciò che viene esattamente miscelato e quale API viene utilizzata per eseguire le istruzioni.

qualunque cosa guardiamo Offerte Direct3D In termini di funzioni di fusione e operazioni di fusione, possiamo vedere che ogni pixel viene prima moltiplicato per un numero compreso tra 0.0 e 1.0. Questo determina quanto del colore del pixel influenzerà l'aspetto finale. Quindi i due colori dei pixel regolati vengono aggiunti, sottratti o duplicati; in alcune funzioni, l'operazione è un'espressione logica in cui viene sempre selezionato qualcosa come il pixel più luminoso.

L'immagine sopra è un esempio di come funziona in pratica; il fattore utilizzato per il pixel sinistro alfa valore. Questo numero trasparente pixel.

Il resto dei passaggi prevede l'applicazione di un valore di nebbia (preso da una tabella numerica creata dal programmatore, quindi facendo la stessa matematica di miscelazione); eseguire alcuni controlli e adeguamenti di visibilità e trasparenza; prima di scrivere infine il colore del pixel nella memoria della scheda grafica.

Perché lezione di storia? Nonostante la relativa semplicità del design (soprattutto se confrontato con gli sviluppatori moderni), il processo spiega i fondamenti di base del texturing: ottenere alcuni valori di colore e mescolarli in modo che i modelli e gli ambienti appaiano come dovrebbero apparire in una determinata situazione.

I giochi di oggi fanno ancora tutto questo, l'unica differenza è la quantità di trame utilizzate e la complessità dei calcoli di fusione. Insieme, simulano gli effetti visivi visti nei film o il modo in cui la luce interagisce con materiali e superfici diversi.

Le basi della testurizzazione

Per noi, una texture è un'immagine 2D piatta applicata ai poligoni che compongono le strutture 3D nel frame visualizzato. Per un computer, non è altro che un piccolo blocco di memoria sotto forma di array 2D. Ogni voce nell'array rappresenta un valore di colore per uno dei pixel nell'immagine della trama (meglio conosciuta) riempimento del testo - pixel di trama).

Ogni vertice in un poligono ha 2 coordinate (di solito sen, v) ti dice a quale pixel della texture è associato. Il vertice stesso ha 3 insiemi di coordinate (X ve Z) e viene chiamato il processo di connessione dei testi ai vertici. mappatura delle texture.

Per vederlo in azione, torniamo a uno strumento che abbiamo utilizzato più volte in questa serie di articoli: Rendering in tempo reale WebGL attrezzo. Per adesso, z coordinare dagli angoli e mantenere tutto in piano.

Da sinistra a destra, abbiamo la trama sen, v coordinate mappate direttamente ai vertici d'angolo x, y coordinate. Poi gli angoli superiori y le coordinate sono aumentate, ma la trama è allungata verso l'alto poiché la trama è ancora mappata direttamente su di esse. Nell'immagine all'estrema destra, la trama questa volta è cambiata: u i valori sono aumentati, ma questo provoca la frantumazione del tessuto e quindi la ricaduta.

Perché ora il tessuto è effettivamente più lungo, anche se più alto u Il valore deve rientrare nella primitiva - essenzialmente la trama è parzialmente ripetuta. Questo è un modo per fare qualcosa che si vede in molti giochi 3D :tripetere. Esempi comuni di questo possono essere trovati in scene con paesaggi rocciosi o erbosi o muri di mattoni.

Ora impostiamo la scena in modo che sia più primitiva e riportiamo in gioco la profondità. Quella che abbiamo di seguito è una classica vista paesaggistica, ma poiché la trama del petto viene copiata e ripetuta tra i primitivi.

Ora questa trama del torace è di 66 chili in formato gif originale e ha una risoluzione di 256 x 256 pixel. La risoluzione originale della porzione di frame occupata dalle texture della cassa è 1900 x 680, quindi solo in termini di "area" di pixel, questa regione dovrebbe essere in grado di visualizzare solo 20 texture della cassa.

Ovviamente stiamo ottenendo più di 20 percorsi così tante trame di petto in background molto Più piccolo di 256 x 256 pixel. In effetti lo sono e hanno attraversato un processo riduzione della trama (sì, è una parola!). Ora proviamo di nuovo, ma questa volta si è avvicinato a uno dei forzieri.

Nota che la trama ha una dimensione di soli 256 x 256 pixel, ma qui possiamo vedere che una trama è più della metà della larghezza dell'immagine larga 1900 pixel. Ha attraversato qualcosa chiamato texture aumento dei tessuti.

Questi due processi di texture si verificano continuamente nei giochi 3D, perché quando la telecamera si sposta sulla scena o i modelli ingrandiscono e rimpiccioliscono, tutte le trame applicate alle primitive devono essere ridimensionate insieme ai poligoni. Matematicamente, questo non è un grosso problema, infatti, anche i più semplici chip grafici integrati lampeggiano in un'azienda del genere. Tuttavia, la riduzione e l'aumento dei tessuti presentano nuovi problemi che devono essere in qualche modo risolti.

Inserisci mini texture

Il primo problema da risolvere è per le trame lontane. Se osserviamo di nuovo la prima immagine del paesaggio della cassa, quelle verso l'orizzonte hanno solo una dimensione di pochi pixel. Cercare di spremere un'immagine di 256 x 256 pixel in uno spazio così piccolo è inutile per due motivi.

Per uno, una trama più piccola occupa meno spazio di memoria sulla scheda grafica, il che è utile per cercare di adattare una piccola quantità di cache. Ciò significa che è meno probabile che venga rimosso dalla cache e l'uso ripetuto di questa trama trarrà il massimo vantaggio dalle prestazioni dei dati che si trovano nella memoria vicina. Il secondo motivo per cui siamo qui per un momento, poiché è legato allo stesso problema per le trame ingrandite.

Una soluzione comune all'uso di grandi trame che vengono frantumate in piccole primitive, corrispondenza. Queste sono versioni ridotte della texture originale; Il motore di gioco stesso può essere costruito (usando il corrispondente comando API per farlo) o può essere pre-creato dai game designer. Ogni livello di texture mipmap ha la metà delle dimensioni lineari del precedente.

Per la trama del torace sarebbe qualcosa del tipo: 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.

Le mipmap sono tutte raggruppate insieme, quindi la trama è ancora lo stesso nome del file, ma ora è più grande. Il tessuto è imballato in modo tale che sen, v Le sue coordinate non solo determinano quale texel applicare a un pixel nel frame, ma anche da quale mipmap. I programmatori quindi codificano il renderer per determinare la mipmap da utilizzare in base al valore di profondità del pixel quadrato, quindi se è troppo alto, il pixel è lontano, quindi è possibile utilizzare una piccola mipmap.

I lettori con gli occhi acuti potrebbero aver visto il lato negativo delle mipmap, e questo a scapito delle trame più grandi. La trama originale del torace era di 256 x 256 pixel, ma come puoi vedere nell'immagine sopra, la trama mipmap ora è di 384 x 256 pixel. Sì, c'è molto spazio libero, ma l'aumento complessivo ad almeno una delle dimensioni della trama è del 50%, indipendentemente da come si impacchettano le trame più piccole.

Tuttavia, questo vale solo per le mipmap predefinite; Se il motore di gioco è stato programmato per generarli correttamente, l'aumento non può mai essere superiore al 33% rispetto alla dimensione della trama originale. In questo modo si ottengono vantaggi in termini di prestazioni e miglioramenti visivi per un aumento relativamente piccolo della memoria sulle mipmap di texture.

Di seguito è riportato il confronto off/on delle texture mipmap:

Sul lato sinistro dell'immagine, le trame delle casse vengono utilizzate "così come sono", risultando in un aspetto granuloso e presumibilmente motivi moiré lontano. A destra, invece, l'uso di mipmaps si traduce in una transizione molto più fluida attraverso il paesaggio, dove la trama della cassa cambia in un colore uniforme all'orizzonte.

Tuttavia, chi vuole trame sfocate che rovinino lo sfondo del loro gioco preferito?

Bilineare, trilineare, anisotropo - tutto greco per me

Viene chiamato il processo di selezione dei pixel da una trama da applicare a un pixel in una cornice campionamento della tramae in un mondo perfetto, la sua dimensione, posizione, direzione, ecc. a prescindere, sarebbe una trama che si adatta esattamente alla primitiva. In altre parole, il campionamento delle texture non è altro che una mappatura piatta da 1 a 1 pixel a pixel.

Poiché questo non è il caso, il campionamento della trama deve tenere conto di una serie di fattori:

  • La texture è ingrandita o ridotta?
  • La texture è originale o una mipmap?
  • Con quale angolazione viene mostrata la trama?

Analizziamoli uno per uno. Il primo è abbastanza chiaro: se la texture viene ingrandita, ci sarà più testo che si sovrappone al pixel nella primitiva; con riduci sarà il contrario, ogni texel ora deve estendersi su più di un pixel. Questo è un po' un problema.

In secondo luogo, poiché le mipmap vengono utilizzate per aggirare il problema del campionamento delle trame con primitive remote, le trame vengono lasciate inclinate. E sì, anche questo è un problema. Perché? Perché tutte le trame sono rese 'a faccia aperta' per una vista, o tutte sono simili alla matematica: la normale della superficie della trama è la stessa della normale della superficie visualizzata sopra la trama.

Pertanto, per avere una trama e una trama troppo piccole o troppo inclinate, filtraggio delle texture. Se non usi questa azione, questo è ciò che ottieni:

Qui, abbiamo sostituito la trama del torace con una trama della lettera R per mostrare più chiaramente quanto disordine otterrà senza il filtraggio delle trame!

Le API grafiche come Direct3D, OpenGL e Vulkan offrono tutti gli stessi tipi di filtri di intervallo, ma usano nomi diversi per loro. In realtà, va tutto così:

  • campionamento del punto più vicino
  • Filtraggio lineare della trama
  • Filtro texture anisotropicotropic

A tutti gli effetti, campionamento del punto più vicino se non sta filtrando, è perché è il pixel più vicino al pixel che richiede che le trame vengano campionate (cioè copiate dalla memoria) e quindi unite al colore originale del pixel.

Qui viene in soccorso il filtraggio lineare. necessario sen, v le coordinate texel vengono inviate all'hardware per il campionamento, ma invece di ottenere il texel più vicino a queste coordinate, il campionatore quattro texel Questi sono direttamente sopra, sotto, a sinistra e a destra di quello selezionato utilizzando il campionamento del punto più vicino.

Questi 4 tessuti vengono quindi miscelati utilizzando una formula ponderata. Ad esempio in Vulkan la formula è:

T "Colore", f Per quello sgocciolato e da 1 a 4 sono quattro i tessuti campionati. Valori alfa ve beta quanto lontano dal punto definito da sen, v le coordinate provengono dal centro del tessuto.

Fortunatamente, tutti coloro che sono coinvolti nei giochi 3D, sia che giochino che che creano giochi, avvengono automaticamente su questo chip di elaborazione grafica. In effetti, il chip TMU in 3dfx Voodoo ha fatto questo: ha campionato 4 singleton e poi li ha mescolati. Direct3D lo chiama stranamente filtraggio bilineare, ma dai tempi del chip TMU di Quake e Voodoo, le schede grafiche sono state in grado di eseguire filtri bilineari solo in un ciclo di clock (se la trama si trova comodamente vicino alla memoria, ovviamente).

Il filtro lineare può essere utilizzato insieme alle mipmap e se vuoi essere davvero fantasioso con il tuo filtro puoi prendere 4 testi da una trama, poi altri 4 dal livello successivo di mipmap e poi unirli insieme. E il nome di Direct3D per questo? trilineare filtraggio. Che cosa trio su questo processo? La tua ipotesi è buona quanto la nostra...

L'ultimo metodo di filtraggio menzionato è chiamato anizotrop. Questo è in realtà un adeguamento al processo eseguito nel filtraggio bilineare o trilineare. Inizialmente grado di anisotropia superficie primitiva (e sorprendentemente complesso) - questo valore cambia le proporzioni della primitiva a causa del suo orientamento:

L'immagine sopra mostra la stessa primitiva quadrata con lati di uguale lunghezza; ma quando ci allontaniamo dalla nostra prospettiva, sembra un rettangolo quadrato e la sua larghezza aumenta al di sopra della sua altezza. Quindi la primitiva a destra ha un'anisotropia maggiore di quella a sinistra (e nel caso del quadrato, il grado è esattamente zero).

La maggior parte dei giochi 3D di oggi ti consente di abilitare il filtro anisotropico e quindi regolarne il livello (da 1x a 16x), ma cosa cambia effettivamente? L'impostazione controlla il numero massimo di campioni texel aggiuntivi prelevati per campione lineare originale. Ad esempio, supponiamo che il gioco sia impostato per utilizzare il filtro bilineare anisotropico 8x. Ciò significa che restituirà 32 valori invece di prendere solo 4 valori di testo.

È chiaro che l'uso del filtraggio anisotropico può realizzare:

Basta scorrere un po' verso l'alto e confrontare il campionamento del punto più vicino per un filtro trilineare anisotropico massimo di 16x. Così liscio, quasi delizioso!

Ma ci deve essere un prezzo da pagare per tutto quel buon sapore di texture burrosa, ed è sicuramente la performance: tutto il massimo filtraggio trilineare anisotropico restituirà 128 campioni di una texture per ogni pixel renderizzato. Anche per le migliori GPU più recenti, questo non può essere fatto in un singolo ciclo di clock.

Se otteniamo qualcosa come AMD Radeon RX 5700 XTLe unità di trama all'interno del processore possono disattivare ciascuna 32 indirizzi texel in un ciclo di clock, quindi caricare 32 texel dalla memoria (32 bit ciascuno di dimensione) in un altro ciclo di clock e quindi metterne 4 insieme per contrassegnare. Quindi viene mescolato per 128 istanze texel che richiedono almeno 16 cicli di clock.

Ora la velocità di clock di base del 5700 XT è 1605 MHz, quindi sedici cicli richiedono solo 10 nanosaniye. Fallo per ogni pixel nel frame 4K. uno unità di tessuto durerebbe ancora solo 70 millisecondi. Ok, forse le prestazioni non sono così importanti!

Già nel 1996, artisti del calibro di 3Dfx Voodoo erano piuttosto abili quando si trattava di gestire le trame. Poteva arrivare al massimo a 1 texel filtrato bilineare per ciclo di clock e significava che 50 milioni di tex potevano essere tagliati ogni secondo mentre il chip TMU oscillava a 50 MHz. Un gioco in esecuzione a 800 x 600 e 30 fps richiede solo 14 milioni di testo filtrato bilineare al secondo.

Tuttavia, tutto ciò presuppone che le trame siano nella memoria vicina e che solo un tex sia mappato su ciascun pixel. Vent'anni fa l'idea di dover applicare più texture a una policy era quasi del tutto estranea, ma ora è un luogo comune. Diamo un'occhiata al motivo per cui si è verificato questo cambiamento.

Illuminando la strada verso immagini straordinarie

Per aiutare a capire come la tessitura sia diventata così importante, dai un'occhiata a questa scena di Quake:

È un'immagine scura, questa era la natura di questo gioco, ma puoi vedere che l'oscurità non è la stessa ovunque: le parti delle pareti e del pavimento sono più luminose di altre per dare una sensazione di illuminazione generale in quell'area.

Le primitive che compongono i lati e il terreno hanno la stessa trama applicata, ma c'è una seconda trama chiamata mappa chiaraviene unito ai valori texel prima di essere abbinato ai pixel quadrati. Ai tempi di Quake, le mappe di luce erano precalcolate e create dal motore di gioco e utilizzate per creare livelli di luce statici e dinamici.

Il vantaggio di utilizzarli era che i calcoli di illuminazione complessi venivano eseguiti sulle trame anziché sugli angoli, migliorando in particolare l'aspetto di una scena e con un costo delle prestazioni molto ridotto. Ovviamente non è perfetto: come puoi vedere a terra, il confine tra le zone illuminate e quelle in ombra è molto netto.

In molti modi, una mappa leggera è solo un'altra trama (ricorda che non sono altro che array di dati 2D), quindi quello che stiamo guardando qui è un uso iniziale di ciò che è noto come multi texture. Come suggerisce il nome, è un processo in cui due o più trame vengono applicate a un principio. L'uso di mappe leggere in Quake è stata una soluzione per superare i limiti dell'ombreggiatura Gouraud, ma con l'aumento delle capacità delle schede grafiche, anche le applicazioni multithread sono cresciute.

3Dfx Voodoo, come altre carte della sua epoca, era limitato in quanto poteva fare in un rendering passaggio. Questa è essenzialmente una sequenza di rendering completa: dal rendering degli angoli alla rasterizzazione del fotogramma, per poi cambiare i pixel in un framebuffer finale. Vent'anni fa, i giochi eseguivano quasi sempre un passaggio.

Questo perché rendere i vertici due volte era molto costoso in termini di prestazioni, poiché si voleva solo applicare più texture. Alcuni anni dopo Voodoo, abbiamo dovuto aspettare che fosse disponibile prima di poter realizzare schede grafiche ATI Radeon e Nvidia GeForce 2 multi-thread in un unico passaggio di rendering.

Queste GPU avevano più unità di trama per sezione di rendering dei pixel (ad es. tubatura), quindi portare un texel filtrato bilineare da due tessuti separati è stato un gioco da ragazzi. Ciò ha reso ancora più popolare la mappatura della luce, consentendo ai giochi di essere completamente dinamici, modificando i valori di luce in base ai cambiamenti nell'ambiente di gioco.

Ma c'è molto di più che si può fare con più trame, quindi diamo un'occhiata.

È normale moltiplicare l'altezza

In questa serie di articoli sul rendering 3D, non abbiamo spiegato come il ruolo della GPU si adatti davvero all'intero punto (lo faremo, non ancora!). Ma se torni Episodio 1e osservando tutto il complesso lavoro sul rendering dei vertici, potresti pensare che questa sia la parte più difficile dell'intero array da gestire per la GPU.

È passato molto tempo e i programmatori di giochi hanno fatto del loro meglio per ridurre questo carico di lavoro. Ciò significava arrivare alla borsa dei trucchi visivi e tirare fuori quante più scorciatoie e cheat possibili, dando lo stesso aspetto visivo di usare molti vertici dappertutto, ma in realtà non usarne tanti per lanciarlo.

E la maggior parte di questi trucchi, mappe di elevazione ve mappe regolari. I due sono legati al fatto che il secondo può essere creato dal primo, ma per ora, diamo solo un'occhiata a una tecnica chiamata: mappatura dell'urto.

La mappatura dei rilievi implica l'utilizzo di un array 2D chiamato heightmap, che sembra una singola versione della trama originale. Ad esempio, l'immagine sopra ha una trama di mattoni realistica applicata a 2 superfici piane. La texture e la mappa dell'altezza hanno questo aspetto:

I colori della mappa dell'altezza rappresentano le normali della superficie del mattone (abbiamo spiegato cos'è la normale Episodio 1 di questa serie di articoli). Quando la sequenza di rendering raggiunge il punto di applicazione della trama del mattone alla superficie, viene eseguita una serie di calcoli per regolare il colore della trama del mattone su normale.

Di conseguenza, i mattoni sembrano più 3D, anche se sono ancora perfettamente piatti. Soprattutto se osservi attentamente i bordi dei mattoni, puoi vedere i limiti della tecnica: la trama sembra un po' deformata. Ma per un rapido trucco per aggiungere più dettagli a una superficie, il bump mapping è molto popolare.

Una mappa normale è come una mappa dell'elevazione, ma i colori di quella trama sono la normale stessa. In altre parole, non è necessario un calcolo per convertire la mappa di elevazione in normale. Potresti chiederti come possono essere usati i colori per rappresentare una freccia nello spazio. La risposta è semplice: ogni texel ha uno specifico R, G, B valori (rosso, verde, blu) e questi numeri sono direttamente X ve Z valori per il vettore normale.

Nell'esempio sopra, il diagramma a sinistra mostra come cambia la direzione della normale su una superficie ruvida. Per rappresentare le stesse normali in una trama piatta (diagramma centrale), assegniamo loro un colore. Nel nostro caso, R, G, B incrementando i valori (0.255.0) per il dritto e poi le quantità di rosso per il sinistro e blu per il destro.

Nota che questo colore non si fonde con il pixel originale: indica al processore in che direzione è rivolta la normale, in modo che la fotocamera possa calcolare correttamente gli angoli tra le luci e la superficie strutturata.

I vantaggi del rilievo e della mappatura normale brillano davvero quando si utilizza l'illuminazione dinamica in una scena e il processo di rendering calcola gli effetti dei cambiamenti di luce per pixel, non per angolo. I giochi moderni ora usano un mucchio di trame per migliorare la qualità della magia fatta.

Questo muro dall'aspetto realistico è incredibilmente solo una superficie piana: i dettagli sui mattoni e la malta non sono stati realizzati utilizzando milioni di poligoni. Invece, fa solo 5 trame e un sacco di lavori matematici intelligenti.

La mappa di elevazione è stata utilizzata per generare la mappa normale per simulare il modo in cui i mattoni proiettano ombre su se stessi e qualsiasi piccola modifica alla superficie. La ruvidità è stata utilizzata per modificare il modo in cui la luce riflette i diversi elementi del muro (ad esempio un mattone appiattito riflette in modo più coerente rispetto alla malta grezza).

La mappa finale, etichettata AO nell'immagine sopra, fa parte di un processo chiamato occlusione ambientale: una tecnica che esamineremo più approfonditamente in un articolo successivo, ma per ora solo ombre.

La mappatura delle texture è fondamentale

Il texturing è assolutamente essenziale per il game design. Ottieni la versione 2019 di Warhorse Studio Il Regno sta arrivando: la salvezza - Un gioco di ruolo in prima persona ambientato nella Boemia del XV secolo, un antico paese dell'Europa centro-orientale. I designer desideravano creare un mondo il più realistico possibile per il periodo in questione. E il modo migliore per immergere il giocatore in una vita di centinaia di anni fa, ogni vista di paesaggio, edificio, set di vestiti, capelli, oggetti di uso quotidiano ecc. Si trattava di avere il look giusto.

Ogni texture unica in questa singola immagine nel gioco è realizzata dagli artisti e il loro utilizzo dal motore di rendering controllato dai programmatori. Alcuni sono piccoli, hanno dettagli di base e richiedono poco in termini di filtraggio o elaborazione di altre trame (ali di pollo, per esempio).

Altri sono ad alta risoluzione e mostrano molti dettagli precisi; filtrato anisotropicamente e mescolato con le mappe normali e altre trame: basta guardare il volto dell'uomo in primo piano. I diversi requisiti di texturing di ogni elemento nella scena sono spiegati dai programmatori.

Tutto questo sta accadendo ora in molti giochi, poiché i giocatori si aspettano più dettagli e realismo. Le trame cresceranno e verranno utilizzate di più su una superficie, ma il processo di campionamento del testo e l'applicazione ai pixel sarà essenzialmente lo stesso dei tempi di Quake. La migliore tecnologia, non importa quanti anni ha, non muore mai!