\\ Home : Articoli : Stampa
Depth of Field
Di RobyDx (del 21/01/2007 @ 11:16:09, in Shader Library, linkato 1504 volte)

Il depth of field o in italiano profondità di campo è la nostra normale visione dell'ambiente. Mettete un dito davanti al volto e mettetelo a fuoco: tutto il resto sarà sfocato. Lo stesso problema insomma della messa a fuoco di ogni macchina fotografica. L'utilizzo della profondità di campo si sta diffondendo rapidamente con ottimi risultati (un ottimo esempio è Prince of Persia The sand of time di Ubisoft). Il risultato è un maggiore realismo delle scene che da un maggiore senso di profondità alla scena.Ottenere questo effetto è abbastanza semplice. Sono sufficienti 2 texture con il renderToSurface. Su una si renderizza la scena mentre sull'altra un depth space. Questo spazio altro non è che la stessa scena con la stessa inquadratura ma che ha come colore la distanza del punto da quello virtualmente a fuoco. Banalmente con un semplice teorema di pitagora calcoliamo la distanza del vertice dal punto a fuoco e proporzionamolo da 0 a 1 dividendo per la distanza massima scelta e limitando il risultato. La scena che si ottiene è un ambiente in bianco e nero che sfuma a seconda della distanza. Infine renderizziamo le 2 texture sullo schermo applicando un filtro di gauss alla prima texture. Il fattore di sfocatura è stabilito appunto dalla seconda texture. Quindi se ad esempio scegliamo il bianco come a fuoco dove la seconda texture è più scura la scena sarà più sfocata. Ricordo che un filtro di gauss significa che ogni punto è la media dei punti che lo circondano. L'esempio mostra una messa a fuoco lineare (ossia utilizzando semplicemente la distanza) ma potete migliorarlo applicando funzioni più articolate. Il principio rimane lo stesso. Vi lascio all'immagine:

...e all'esempio :

  • VB.Net 2003 o framework 1.1
  • linguaggio usato: HLSL
  • requisiti hardware: VS_2_0, PS_2_0

    depthOfFieldHLSL.zip 1,5Mb