• Non ci sono risultati.

Complessi simpliciali di dimensione due

Per implementare i complessi simpliciali di dimensione due e tre si seguir`a una nuova linea architettonica che permetter`a di eliminare dinamicamente i simplessi che li compongono.

Cancellare una molla dal complesso simpliciale di dimensione uno definito finora non `e operazione agevole, in quanto non esiste una texture che man- tenga, centralizzate, le istanza dei segmenti. Esse, invece, sono presenti in

18Si ricorda che un ogni texel contiene due coppie molla-massa opposta. La coppia pari si trover`a nei membri r e g; quella dispari in b ed a.

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 117

Figura 4.31: Il frammento connesso con la massa 21 compie i look-up sulle varie texture per permettere la collezione delle informazioni per l’integra- zione. I colori nella massa di connettivit`a indicano le molle incidenti sulla massa

doppia copia (una per ogni massa attaccata agli estremi di una molla) all’in- terno della texture di connettivit`a. Con l’architettura attuale, per eliminare una molla s, sarebbe necessario risalire alle masse che condividono tale molla e cancellare per ognuna di queste i riferimenti ad s contenuti nella texture di connessione. Il costo dell’operazione sarebbe lineare sulle dimensioni di tale texture. Se invece si avesse una texture centralizzata cancellare la molla s avrebbe un costo costante.

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 118 uniform bool pos_stage;

uniform sampler2D mass,spring, con; uniform float dt, damp, nmass;

uniform vec2 dimmass, dimspring, dimconn;

varying vec2 texcoordpos,texcoordvel, texcoordacc; void main(void) {

vec4 mspos = texture2D(mass,texcoordpos); float index = mspos.w;

mspos.w = 0.0;

vec4 msvel = texture2D(mass,texcoordvel); float nconn = msvel.w;

msvel.w = 0.0;

vec4 msacc = texture2D(mass,texcoordacc); float offset = msacc.w;

msacc.w = 0.0; vec4 f= vec4(0.0); if (!pos_stage) { int i = 0; float h = 0.0; while(i < nconn) {

vec4 tot_ind = texture2D(con,coordTx(offset + h,dimconn)); vec2 ind; if (mod(h,2.0) == 0.0){ ind.x = tot_ind.x; ind.y = tot_ind.y; } else{ ind.x = tot_ind.z; ind.y = tot_ind.w; } if (ind.x != -1.0){ vec4 s1 = texture2D(spring,coordTx(ind.x,dimspring)); vec4 m1 = texture2D(mass,coordTx(ind.y,dimmass)); vec4 len1 = m1 - mspos;

vec4 fs = s1.r * (length(len1) - s1.g) * normalize(len1) - damp * msvel; f = f + fs; } ++i; h = h + 1.0; }

vec4 vel = msvel + fs * dt;

gl_FragColor = vec4(vel.x,vel.y,vel.z,nconn); }

else {

vec4 pos = mspos + msvel * dt;

gl_FragColor = vec4(pos.x,pos.y,pos.z,index); }

}

Figura 4.32: Il fragment program che implementa la gestione del sistema masse molle per complessi simpliciali di dimensione uno

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 119 Si definisce, quindi, per il simplesso di grado due una nuova texture triang contenente tutti i triangoli componenti il complesso simpliciale. Inol- tre si modifica leggermente il significato della texture di connessione. In essa non ci saranno pi`u riferimenti a masse e molle ma solo gli indici dei triangoli che incidono in una massa m. Sar`a solo tramite questi che m potr`a risalire alla massa h attaccata dall’altra parte della molla. Infine si rende necessaria una ridefinizione della texture delle molle. Per comodit`a si supporr`a il coef- ficiente k come una costante condivisa da ogni molla componente il sistema e si lasceranno all’interno della texture le sole lunghezze a riposo di ognuno dei tre lati del triangolo. Tali lunghezze saranno memorizzate all’interno dei campi di un texel seguendo un ordine stretto di precedenza sui lati del trian- golo (fig 4.34). Nel seguito ci si riferir`a a questa texture come qlength. Le dimensioni di qlength saranno pari a quelle di triang generando, cosi, una corrispondenza immediata tra il texel di un triangolo e il corrispettivo texel di qlength.

In figura sono raffigurate le caratteristiche appena elencate delle varie texture.

Non viene invece modificata in alcun modo l’interpretazione fornita pre- cedentemente sugli strati della texture delle masse.

4.12.1

Fragment-program

Dato un frammento relativo ad una massa m si accede tramite l’offset ed il numero di triangoli connessi ad m alla texture della connettivit`a. Con gli indici dei triangoli incidenti nella massa, si arriva facilmente ai simplessi contenuti nella texture triang. Tramite triang si ottengono le tre masse che sono ai vertici del triangolo. Tra queste, per`o, c’`e sicuramente la massa m che sta effettuando il calcolo; anche se `e ignoto ad m stessa in quale componente

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 120 `

e stata memorizzata. Ovviamente non essendoci alcuna molla tra una massa e se stessa si evita di occupare la GPU con calcolo inutile, e ci si concentra invece sulle altre due masse. Con gli indici trovati in triang si accede alla texture delle masse dove si ottengono le informazioni riguardanti la posizione degli elementi che partecipano con m alla definizione del triangolo (fig 4.33).

Figura 4.33: Schema di computazione per i complessi simpliciali di dimensione due. Si noti la presenza della texture centralizzati dei triangoli

A questo punto per definire la forza generata su m dalla molla appe- sa su uno dei lati del triangolo sarebbe sufficiente recuperare l’informazione sulla lunghezza a riposo della molla stessa. Trovare il texel corrispondente all’interno della texture di qlength `e operazione facile. Esso avr`a le stesse

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 121 coordinate del triangolo all’interno della texture di triang. Purtroppo per`o non esiste un meccanismo semplice ed elegante per determinare facilmente quale tra le tre lunghezze di riposo contenute nel texel tx di qlength sia quella che si riferisca alla molla su cui si sta operando. Si consideri la figu- ra 4.34. Il numero in nero sulle masse rappresenta il loro identificativo, il numero in rosso il loro indice relativo al triangolo. All’interno della texture triang, nel texel riguardante il triangolo in grigio, le masse sono state me- morizzate seguendo l’ordine imposto da tale indice. In qlength, nella fase dell’inizializzazione dell’applicazione principale, le estensioni a riposo delle molle costruite sui lati del triangolo, sono state a loro volta salvate seguendo un rigido ordinamento; nella componente r del texel t la lunghezza riguar- dante il lato 0-1 (quello che in figura unisce le masse 42 e 40), in g 0-2 e in b 1-219.

Si considerino le masse 40 e 38, che formano il segmento 1-2. Per poter accedere alla loro lunghezza a riposo, che, come abbiamo appena visto, per costruzione `e contenuta nella terza componente di t, si deve sapere quale sia il loro indice relativo al triangolo in questione. Per far questo, purtroppo, non vi `e altro modo che fare un ricerca all’interno delle quattro componenti del texel dell’identificativo della massa.

Una volta ottenuta tale informazione, non vi `e alcuna difficolt`a nel com- pletare il processo di integrazione numerica e far avanzare la simulazione del sistema masse-molle su qualsiasi complesso simpliciale di dimensione due.

19Si specifica che tale ordine non `e relativo solo al triangolo in figura ma va esteso ad ogni triangolo componente la mesh.

CAPITOLO 4. COMPLESSI SIMPLICIALI IN GPU 122

Figura 4.34: Ordine della texture delle lunghezze a riposo delle molle

Documenti correlati