Profondità di campo è un effetto fotografico causata da lunghezza focale e apertura. Un articolo molto interessante su questo argomento è stata pubblicata in istockphoto.com . Esso fornisce una profondità-cue affidabile per bidimensionale, materiale proiettato. In altre parole: Rende immagini sembrano 3D mentre sono ancora proiezioni 2D.
Nella attuale generazione di hardware grafico, è possibile rendere un sacco di fantasia effetti di post-processing - AN oltre morbide ombre e il motion blur, profondità di campo (DOF) potrebbe essere il dell'effetto più spesso utilizzati per migliorare la qualità visiva. Vi è una vasta copertura su diverse tecniche di creazione di effetti DOF piacevoli - un semplice google per "profondità di shader di campo" mi ha dato circa 74.000 colpi. Per una demo che volevo scrivere, ho deciso di utilizzare un approccio semplice, alpha-channel-based perché è semplice, veloce e sembra bello.
L'idea è semplice: se si dispone già di uno shader che fa cose come per-pixel-illuminazione, basta mettere le informazioni di profondità nel canale alfa del colore risultante. Tutto ciò che deve essere fatto nel secondo passaggio: rendono nuovamente l'immagine e sfocare l'immagine con un kernel adatto. Come kernel, ho scelto una Poisson-disco-filtro con i dati CPU-precalcolate - questo è meno "frastagliato" rispetto all'utilizzo di un semplice kernel quadratica, dando una migliore qualità visiva da meno campioni. Per evitare brutte aloni intorno ai bordi di aree che hanno approfondito le differenze di altezza, il risultato non è semplicemente una foto sfocata, ma la lunghezza focale controlla anche la quantità di dati di immagine sfocate entrare nel risultato finale.
vec4 vColor = Texture2D (sceneMap, gl_TexCoord [0] xy.); galleggiare fBlurAmount = abs (vColor.a * 2,0-1,0); galleggiare fTexel = 16.0/mapSize; vec4 vResult; for (int i = 0; i <16; + + i) { vResult + = Texture2D (blurMap, gl_TexCoord [0] xy + fBlurAmount * fTexel * poisson [i] xy * poisson [i] z...); } vResult / = 16,0; gl_FragColor = mix (vColor, vResult, fBlurAmount);
Sono consapevole che questo approccio è piuttosto limitata - non appena è necessario il canale alfa per altri effetti (come un bagliore-pass o di velocità), non può essere utilizzato in questo modo. Ma comunque, io sono felice con i risultati. ![]()
| |

















































