30.12.2012 Views

Amiga Magazine Online

Amiga Magazine Online

Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

for r = first-col to lastcol<br />

a = (Ha*r + Va*s + Oa) / (Hc*r + Vc*s + Oc)<br />

b = (Hb*r + Vb*s + Ob) / (Hc*r + Vc*s + Oc)<br />

u = 256 * a<br />

v = 256 * b<br />

~ritePixel(s+Hcenter,r+Vcenter,texture[v][u])<br />

endf or<br />

endf or<br />

dove:<br />

first-row è la prima riga a schermo del poligono;<br />

last-row è l'ultima riga a schermo del poligono;<br />

fint-col è la prima colonna a schermo della riga attuale;<br />

last-col è l'ultima colonna a schermo della riga a.ttuale;<br />

Hcenter e Vcenter, in uno schermo da 320x200, possono<br />

essere rispettivamente pari a 160 e 100.<br />

Per semplicità, consiglio di iniziare con un quadrato non<br />

ruotato, per esempio:<br />

con z tale da far sì che la proiezione a schermo sia suffi-<br />

cientemente grande. Tale valore dipende, ovviamente,<br />

dai fattori di scala usati nella proiezione prospettica, per i<br />

quali consiglio un valore di 128, ottimo per la maggio-<br />

ranza dei casi e facilmente ottimizzabile tramite una velo-<br />

ce operazione di shift.<br />

Le prime ottimizzazioni balzano subito all'occhio e consi-<br />

stono, come al solito, nel portare fuori dal ciclo più inter-<br />

no i calcoli che non dipendono da r e nell'eliminazione<br />

di ripetizioni nei calcoli. Inoltre, dato che r varia con<br />

passo costante e pari a uno, è possibile convertire i pro-<br />

dotti tra Ha, Hb, Hc ed r in somme successive. Vediamo:<br />

for s = first-row to last-row<br />

cl = first-col*Ha + Va*s t Oa<br />

c2 = first-col*Hb + Vb*s t Ob<br />

c3 = first-col*Hc + Vc*s + Oc<br />

for r = first-col to lastcol<br />

u = 256 * cl / c3<br />

v = 256 * c2 / c3<br />

WritePixel(s+l60,rtl00,texture[v][u])<br />

cl += Ha<br />

c2 += Hb<br />

c3 += Hc<br />

endf or<br />

endf or<br />

Quello che abbiamo appena visto è il ciclo principale di<br />

una generica routine di texture mapping, applicabile a<br />

un qualunque poligono nello spazio. Tale ciclo è partico-<br />

larmente lento in quanto rimangono da effettuare ben<br />

due divisioni e due moltiplicazioni (sostituibili con due<br />

shift) per pixel che, per il momento, non ci interessa otti-<br />

mizzare. La cosa più importante è scrivere una procedura<br />

di texture mapping che, anche se lentamente, funzioni<br />

alla perfezione. Le ottimizzazioni verrano realizzate in un<br />

secondo momento.<br />

Allo stato attuale, il problema principale è rappresentato<br />

dal calcolo dei valori che, nel listato precedente, ho sim-<br />

bolicamente indicato con fint-rou! last-row, first-col e<br />

las~col. Per effettuare tale calcolo, è necessario proietta-<br />

re a schermo (cioè in 2D) i vertici del poligono ed ese-<br />

guire una procedura comunemente indicata con il nome<br />

di scan conz~ersion (del quale non riesco a trovare una<br />

traduzione soddisfacente in italiano).<br />

Scan Conversion<br />

La scan conversion è una procedura utilizzata per suddi-<br />

videre un poligono in un insieme di righe di pixel, in<br />

modo che possa essere facilmente tracciato sullo scher-<br />

mo (si osservi la figura 2). La conversione viene in gene-<br />

re effettuata per righe piuttosto che per colonne, per ov-<br />

vi motivi dipendenti dall'organizzazione in memoria della<br />

pagina video (vedremo in una delle prossime puntate<br />

che, in alcuni casi, risulta conveniente effettuare una<br />

conversione per colonne). Le tecniche per effettuare tale<br />

suddivisione sono di vario genere e dipendono essenzial-<br />

mente dal tipo di poligoni che si ha intenzione di tratta-<br />

re.<br />

Esistono algoritmi di scan conversion molto generali, che<br />

Fig. 2 -Applicazione deUa procedura di scan conversion<br />

a un generico poligono.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!