|
Poligoni,
curve e modellazione
Prima
di ogni cosa è importante affrontare le varie argomentazioni
per ordine. Stiamo parlando di immagini tridimensionali e
pertanto dobbiamo comprendere quale è la struttura essenziale
di una immagine 3D. L'elemento fondamentale per un immagine
tridimensionale è un poligono piano. Un poligono è sostanzialmente
una figura costituita da almeno tre vertici (o punti) non
allineati e uniti tra di loro da dei segmenti. Se evince quindi
con estrema facilità che il poligono più semplice è il triangolo
in quanto costituito dal minor numero di vertici richiesti
per generarne uno. Se invece i vertici fossero stati due avremmo
avuto semplicemente le coordinate cartesiane per individuarne
un segmento e calcolarne la lunghezza o per individuare una
retta. Pertanto quando si parla di un numero di poligoni massimo
che un processore può generare ci stiamo riferendo a dei triangoli
(il poligono più semplice in assoluto) salvo diversa specificazione.
Ogni struttura tridimensionale è pertanto definita poligonale
in quanto le immagini sono costituite da poligoni triangolari
o tutt' al più quadrangolari. Per fare un ulteriore esempio:
una figura apparentemente sferica sarà in realtà costituita
da tanti poligoni triangolari o quadrangolari che condivideranno
dei vertici
 |
 |
|
Il
triangolo è il poligono più semplice in assoluto, composto
da tre soli vertici.
|
Come
si può notare dall'immagine questa sfera 3D è costituita
in realtà da tanti piccoli poligoni triangolari
|
Per ottenere le immagini tridimensionali che che vediamo nei
videogiochi i grafici procedono seguendo un iter specifico.
Il primo passo è il Modelling o modellazione. In sede
di modelling vengono create delle strutture poligonali complesse
lavorando con i poligoni. Spesso per farlo ci si avvale di
Primitive, o forme geometriche tridimensionali di base.
A questa categoria appartengono Prismi, Cubi, Sfere, Parallepipedi,
Cilindri, Toroidi, Coni e via dicendo. Modificando queste
forme con strumenti molto potenti caratteristici dei migliori
programmi di grafica 3D (3D studio, Ligthwave, Maya etc.)
si ottengono strutture molto più complesse del modello di
base. Un'altro metodo di modellazione è quello di creare letteralmente
la struttura base di un oggetto poligono per poligono partendo
da un immagine di sfondo caricabile nell'area di lavoro di
un programma di grafica, un po' come quando si ricalca un
immagine a mano. Naturalmente più alto è il numero dei poligoni
che costituiscono oggetti complessi e migliore sarà la resa
di quest'ultimi.
 |
|
Alcuni
esempi di primitive su cui lavorare per ottenere oggetti
più complessi
|
|
Un
esempio: partendo da un semplice parallelepipedo con
opportuni comandi ho realizzato in meno di un minuto
questo bicchiere, oggetto 3D più complesso e tondeggiante.
|
 |
|
Lo
stesso bicchiere riproposto con meno poligoni. Un oggetto
costituito da meno poligoni è più semplice da calcolare
e visualizzare ma il risultato è decisamente peggiore.
|
 |
|
La base di un volto umano realizzata partendo dalla stessa
primitiva utilizzata per modellare il bicchiere |
Una
delle caratteristiche più interessanti di PS2 è la possibilità
di utilizzare le cosiddette Curve di Bezier. Fondamentalmente
una curva è una linea tondeggiante ottenuta interpolando tra
di loro una serie di punti. Per quanto riguarda le Curve
di Bezier possiamo dire tratta di un particolare tipo
di curva in cui ogni punto della curva (Bezier Corner) dispone
di due punti di controllo. questo ne permette un efficace
e versatile controllo che rende questo strumento una valida
alternativa nella modellazione organica (modellazione di oggetti
3D rappresentanti esseri viventi come animali, uomini e piante).
Da un punto di vista matematico le Curve di Bezier sono generate
da funzioni semplici e non pesanti per la cpu che riesce in
questo modo a generare le coordinate di un oggetto tondeggiante
in meno tempo rispetto al calcolare la controparte poligonale.
Chiariamo in questa sede un'altra cosa: ogni volta che si
parla di una console la prima cosa che si nota è la quantità
di poligoni al secondo che il sistema è in grado di
generare e muovere. Come detto nell'introduzione, senza effetti
grafici attivati, PS2 è in grado di generare e visualizzare
un picco massimo di 66 milioni di poligoni al secondo. Questo
non significa che le scene generate da PS2 possano essere
costituite da questa enorme quantità massima di poligoni.
Ricordate che nel videogioco le immagini sono in movimento
ed il movimento viene misurato attraverso gli FPS (frame
per second o fotogrammi al secondo) Ogni animazione è costituita
da un numero di poligoni variabili in movimento fotogramma
dopo fotogramma, secondo dopo secondo. Pertanto per calcolare
la massima presenza media di poligoni in ogni fotogramma si
dovranno rapportare il numero dei poligoni per secondo al
numero degli fps. Ad esemepio, consideriamo il motore grafico
di un gioco che riesca a muovere circa 10 milioni di poligoni
al secondo ad una velocità di 60 fps. Il numero medio dei
poligoni presenti in ogni fotogramma sarà dato da 10 milioni
diviso 60.
Il
Texture Mapping
Passiamo
adesso alla trattazione di un aspetto fondamentale nella grafica
3D: il Texture Mapping. E' in fase di texture mapping
che gli ambienti ed i personaggi 3D acquisiscono realismo
grazie all'applicazione di textures (o tessuti) che simulano
veri e propri materiali virtuali, dalle rocce ai tessuti,
dalla pelle all'acqua, dai mattoni alle cortecce degli alberi.
Ogni oggetto tridimensionale per acquisire realismo o cmq
un aspetto più "vivo" deve godere dell'applicazione di textures
e questo avviene proprio durante il processo di texture mapping.
Delle buones texture possono dare un ottimo aspetto anche
a scene composte da un numero di poligoni essenziale.
 |
 |
|
Le due immagini qui proposte rappresentano la stessa
scena 3D, cioè una caverna con un fuoco acceso. L'unica
differenza è che nella prima immagine le textures sono
state disattivate . Questo mette in evidenza strutture
poligonali non dando l'effetto di realismo desiderato.
Con un texture mapping corretto l'immagine avrebbe avuto
un aspetto differente (si noti ad esempio il fuoco e
la parete rocciosa) così come accade nella seconda figura.
Questo è un semplice esempio dell'importanza del texture
mapping.
|
 |
|
In
queste immagini viene riproposta una stessa scena 3D
prima senza textures e poi con textures differenti per
la seconda e la terza immagine. Questo mette in evidenza
come, se ad una stessa scena applichiamo di volta in
volta textures diverse, la resa finale cambia radicalmente.
|
E'
possibile combinare diversi tipi di textures tra di loro per
ottenere mappe più complesse e quindi ricche di particolari.
Per fare un esempio: per un effetto fotorealistico le texture
sono solitamente delle foto modificate attraverso programmi
di fotoritocco e tramite i material editor dei
programmi di grafica 3D. La loro natura è bidimensionale ma
tuttavia attraverso opportune correzioni e sovrapposizioni
è possibile creare delle textures su più livelli capaci di
dare la sensazione di tridimensionalità. Un esempio possono
essere le bump map, o mappe di rilievo. Il bump
mapping è un metodo per simulare superfici scabrose, con
rilievi (quindi tridimensionali), attraverso l'utilizzo di
textures bidimensionali. Questo avviene per mezzo di un sistema
di sovrapposizioni di più immagini che grazie a particolari
algoritmi che processano le aree luminose della mappa bump
andranno a generare in corrispondenza di quell'area un rilievo
più o meno marcato. Il bump mupping tiene anche conto di eventuali
cambi di illuminazione simulando sempre una scabrosità confacente
alle opzioni impostate. L'utilizzo delle bump permette di
risparmiare notevoli quantità di poligoni alleggerendo la
cpu.
|
In
queste immagini è possibile notare la texture di partenza
(la foto di un marmo rosso, decisamente piatta), la
bump map che verrà utilizzata (un negativo della foto
in cui le aree + chiare rappresenteranno i punti di
maggior rilievo) ed infine la bump map applicata all'immagine
di partenza. Noterete la scabrosità acquisita dall'imamgine
nella sua resa finale
|
Ad
ogni modo le bump map non sono l'unico aspetto "rilevante"
:) del texture mapping. Come abbiamo già detto per i fini
fotorealistici si parte ssolitamente da una foto che verrà
successivamente modificata per ottenere l'effetto desiderato.
Un'altro modo per aggiungere particolari ad una mappa sono
le texturer procedurali. Esse sono sostenute da particolari
algoritmi casuali capaci di generare immagini infinite e mai
uguali che si stendono lungo tutta l'area sulla quale sono
applicate. l'utilizzo o l'aggiunta di una texture procedurale
crea solitamente un effetto di maggiore varietà nella struttura
dell'immagine, rendendola pertanto più interessante.
Differente
è invece il concetto di textures ottenute utilizzando solo
foto o immagini opportunamente modificate. Infatti, a meno
che le dimensioni della texture non siano impostate per ricoprire
interamente l'oggetto desiderato, gli algoritmi di applicazione
della texture effettueranno un copia/incolla dell'immagine
disponendola a ripetizione su tutto l'oggetto. Appare evidente
che in determinate circostanze questa scelta potrebbe non
essere la migliore, tuttavia se l'mmagine è "ritagliata" in
maniera tale che nella sua ripetizione di sia una coincidenza
perfetta l'effetto non sarà sgradevole. In talune situazioni,
addirittura, è proprio l'ideale come ad esempio per immagini
di pavimenti o mura di mattoni e via dicendo.
|
Due
textures ripetute più volte su una parete. Nella visione
di insieme della prima figura la ripetitività risulta
monotona. Nella seconda immagine, invece, tale ripetitività
è l'ideale per l'effetto desiderato, ovvero quello di
muro o di un pavimento.
|
Le
mappe di riflessione, invece, sono delle immagini che
verranno applicate su uno specifico oggetto con il preciso
compito di simulare solitamente la riflessione dell'ambiente
circostante (ma non sempre). Applicando arbitrariamente un'immagine
di riflessione il sistema si limiterà a posizionare la mappa
nel punto e nel modo (riflessione planare, sferica etc.) che
noi gli abbiamo specificato.
 |
|
Mappa
di riflessione planare evidente nello specchio d'acqua.
Qui è anche evidente l'effetto Alpha Blending che verrà
analizzato più avanti.
|
Altro
aspetto interessante nel campo delle textures sono le cosiddette
immagini di proiezione. Queste immagini vengono largamente
usate per creare degli effetti di illuminazione interessanti.
In pratica è come mettere un cartoncino ritagliato davanti
ad un riflettore per ottenere delle figure luminose. Allo
stesso modo sul riflettore virtuale verrà applicata un'immagine
di proiezione nella quale le aree nere verranno processate
ed interpretate come zone attraverso le quali la luce non
potrà passare mentre le aree bianche saranno considerati come
dei "buchi" o passaggi che saranno attraversati dal fascio
luminoso colpendo gli oggetti desiderati e dando vita ad interessanti
giochi d'ombra e di luce.
| Ecco
un semplice esempio di un'immagine di proiezione ed il
suo utilizzo in una semplice scena. L'effetto, seppur
semplice, dona ricchezza di particolari rendendo la scena
quantitativamente e qualitativamente più piena |
Introduciamo
alla fine della sezione riguardante le textures il concetto
di texel (che ci tornerà utile più avanti). Come il
pixel è il punto base che costituisce un'immagine così
il texel è il punto base, o elemento fondamentale,
di una texture. Fondamentalmente sono la stessa cosa ma quando
si parla di textures è sintatticamente più corretto parlare
di texel e non di pixel.
Effetti
Grafici
Siamo finalmente giunti alla descrizione degli effetti grafici
che insieme al texture mapping sono così dispendiosi in termini
di risorse fino al punto di ridurre di un terzo le capacità
di visulalizzazione poligonali di un motore grafico. Tuttavia
tali effetti sono necessari per la massima qualità possibile
dell'immagine e la riduzione dei poligoni generati da CPU
a favore di questi effetti è un sacrificio indispensabile
per usufruire di tutti quei tocchi di classe che possono rendere
eccezionale il comparto grafico di un prodotto ludico .
L'Alpha
Blending è' un processo mediante il quale si gestisce
la trasparenza di un pixel rispetto al sottostante attraverso
una vera e propria fusione di più immagini. Grazie all'alfa
blending si possono, per esempio, gestire effetti quali la
foschia della nebbia e la trasparenza dell'acqua (vedere l'imamgine
d'esempio delle mappe di riflessione e notare la trasparenza
dell'acqua).
L'Antialiasing è una tecnica mediante la quale vengono
smussate le parti di un'immagine che presentano dello scalettamento
per ottenere una miglior qualità visiva. Con l'antialiasing
si può, per esempio, eliminare il fastidioso aspetto scalettato
dalle linee oblique. E' implementato, in genere, alle basse
risoluzioni, dato che alle alte il maggior numero di pixel
visualizzati tende ad attenuare naturalmente le scalettature
e pertanto l’antialias sarà meno “forte". Esso opera attraverso
un particolare algoritmo che riempie i bordi scalettati aggiungendo
grandi quantità di pixel in quelle zone. Le risorse impiegate
dall'Antialiasing sono enormi, basti pensare che in un programma
di grafica 3D l'applicazione dell'Antialias ad un livello
minimo può anche quintuplicare il tempo di rendering
richiesto per ogni fotogramma.
 |
 |
|
Una
stessa scena renderizzata prima senza antialias e poi
con. Sono evidenti le scalettature nei contorni della
prima immagine mentre nella seconda prevale un senso
di continuità e di armonia del contorno grazie alla
presenza di un maggior numero di pixel generati proprio
dalle routines di antialias.
|
Il
Bilinear Texture Filtering è metodo che serve per applicare
una texture evitando il fenomeno della "quadrettazione" dei
texel: si analizza un texel alla volta e si interpola con
i 4 texel adiacenti per ottenere quello finale. In questa
maniera vengono generate delle differenze cromatiche tra texel
e texel molto vicine e pertanto morbide ed uniformi rendendo
impossibile la visualizzazione dei singoli textel, difetto
che affligge i giochi per PSone.
Trilinear texture filtering è tecnica simile al
Bilinear Filtering utilizzata per applicare una texture
in modo da eliminare il fastidioso effetto a quadretti. Si
utilizzano 8 pixel e si interpolano per ottenere quello finale:
il risultato è molto superiore a quello che si ottiene con
il bilinear texture filtering. Tuttavia in termini
di risorse è molto più dispendioso.Per questo processo si
utilizza sempre il mipmapping.
Mipmapping è una sofisticata tecnica utilizzata nelle
animazioni e nei giochi 3D per applicare le textures ad oggetti
in movimento che si allontanano o avvicinano dall'osservatore.
Grazie al mipmapping si sfruttano numerose versioni della
stessa texture, diverse solo nella risoluzione, scegliendo
di volta in volta quella con le dimensioni più appropriate
in base alla grandezza del poligono su cui va applicata.
Il Gourad Shading è una tencnica di ombreggiatura tendente
a smussare i poligoni e quindi rende possibile l'uniformità
nella superfice degli oggetti 3D non visualizzando i singoli
poligoni che li costituiscono. Il Gourad Shading utilizza
un'algoritmo molto leggero e quindi non incide sulle prestazioni
di un sistema.
|
Confronto
tra una sfera senza ombreggiatura Gourad e la stessa
sfera con tale opzione. Il Gourad Shading agisce sulla
superficie della sfera rendendola liscia tuttavia non
elimina la spigolosità del bordo dell'immagine . Questo
dipende da numero di poligoni che costituiscono l'oggetto
in questione. Maggiore sarà il numero di poligoni e
migliore sarà la sensazione di rotondità del bordo.
|
E'
detto Fogging l'effetto nebbia che si utilizza
in una scena 3D per nascondere gli oggetti distanti sfumandone
i loro colori verso un altro, generalmente il bianco. Questa
tecnica, oltre a dare un gradevole effetto visivo, alleggerisce
anche il carico di lavoro sul chip grafico in quanto i poligoni
nascosti completamente dalla nebbia non vengono renderizzati.
Z-Buffer
è una zona della memoria destinata a conservare le informazioni
dell'asse z di un pixel: in parole povere, lo Z-Buffer contiene
la profondità del pixel nello spazio. Utilizzando lo Z-Buffer
si può effettuare una cernita di quali pixel dovranno essere
renderizzati e quali no: dopo la generazione di un pixel,
si confronta la sua profondità con quella del pixel precedentemente
generato e, se risulta coperto, verrà eliminato dalla pipeline
e non sarà renderizzato, alleggerendo i calcoli ed aumentando
le prestazioni. Lo Z-Buffer può avere una precisione a 16,
24 oppure 32 bit: maggiori sono i bit utilizzati, più preciso
è l'informazione memorizzata e migliore sarà la qualità finale
del rendering.
|