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.