Monday, July 14, 2008

Buco Nero

Uno dei problemi con i quali ho combattuto fino a sabato scorso riguardava la definizione dei piani di clipping.
Tutte le schede video infatti, per guadagnare in prestazioni, permettono di impostare due piani, detti piani di clip, che definiscono la zona entro la quale gli oggetti devono essere considerati visibili o, analogamente, le due zone dello spazio nelle quali NON vanno disegnati tutti i triangoli che vi appartengono.
Il concetto che sta alla base di una simile decisione è abbastanza semplice ed intuitivo: un oggetto molto lontano da noi sarà talmente piccolo che difficilmente sarà anche visibile. Quindi tanto vale nemmeno disegnarlo, si risparmiano energie. E un oggetto troppo vicino idem, tanto vale considerarlo dietro alla nostra nuca e comunque non visibile.
Definiti sia il piano di clip "lontano", che quello "vicino", l'area racchiusa tra di essi, chiamata "frustum", è di fatto l'unica porzione dello spazio che viene considerata dalla scheda video, ed è anche la zona dove viene implementato lo z-buffer.
Z buffer che, mi serve per disegnare quei pianeti tipo Saturno, con l'anello, dove non è sufficiente affidarsi alle normali per evitare i problemi di facce nascoste.
Ora, lo spazio e' immenso, lo z-buffer no. Se, come detto, definisco un unico z-buffer per tutto il settore, esso avra' una risoluzione ridicola, essendo esso a 16 bit.
L'idea è quella quindi di racchiudere solo il pianeta dentro il frustum, e cambiare frustum ogni volta che disegno un altro pianeta. In questo caso le dimensioni saranno non più quelle dell'intero sistema solare, ma bensì del solo anello, e lo z-buffer in questo caso funziona decorosamente.

Fino a sabato ho combattuto come un disperato cercando di far star dentro al frustum il pianeta, con risultati pero' catastrofici, come potete leggere qui se ne avrete mai voglia.
Fortunatamente grazie al forum gamedev ho trovato chi mi ha fatto capire cosa sbagliavo ed ora Saturno non ha più buchi!

No comments: