Snelle en eenvoudige 2-Pass Depth of Field

Gnome Depth-Of-Field Scherptediepte is een fotografische effect wordt veroorzaakt door diafragma en brandpuntsafstand. Een zeer interessant artikel over dit onderwerp is verschenen in istockphoto.com . Het biedt een betrouwbare diepte-cue voor twee-dimensionale, geprojecteerde materiaal. Met andere woorden: Het maakt foto's zien er 3D terwijl ze nog 2D projecties.

In de huidige generatie van grafische hardware, is het mogelijk om een ​​heleboel mooie post-processing effecten maken - een naast zachte schaduwen en de motion blur, zou scherptediepte (DOF) op zijn van de meest gebruikte effect op visuele kwaliteit te verbeteren. Er is een enorme dekking op verschillende technieken in het creëren van aangename DOF effecten - een eenvoudige google naar "scherptediepte shader" een gaf me ongeveer 74.000 treffers. Voor een demo Ik wilde schrijven, heb ik besloten om een ​​eenvoudige, alpha-channel-gebaseerde aanpak te gebruiken, want het is eenvoudig, snel en ziet er leuk uit.

Het idee is eenvoudig: als u al een arcering in die dingen zoals per-pixel-verlichting doet, alleen de diepte-informatie zetten in alfakanaal de resulterende kleur is. Dat alles moet worden gedaan in de tweede pas: geven het beeld weer en het beeld onscherp wordt met een geschikte kernel. Zoals kernel, ik koos voor een Poisson-Disc-filter met CPU-precomputed data - dit is minder "rafelig" dan met behulp van een eenvoudige kwadratische kernel, waardoor een betere visuele kwaliteit met minder samples. Om te voorkomen dat nare halo's rond de randen van de gebieden die hoge diepte-verschillen hebben, het resultaat is niet alleen een vage foto, maar de brandpuntsafstand bepaalt ook hoeveel wazig beeldgegevens te krijgen in het uiteindelijke resultaat.

  vec4 vColor = texture2D (sceneMap, gl_TexCoord [0] xy.);
 float fBlurAmount = abs (vColor.a * 2,0-1,0);
 float 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); 

Ik ben mij ervan bewust dat deze aanpak is vrij beperkt - zodra het alfakanaal is nodig voor andere effecten (zoals een glow-pass of snelheid), kan het niet worden gebruikt als deze. Maar goed, ik ben blij met de resultaten. ;)

Dit bericht is geplaatst in Computer Science en gelabeld , , , . Bookmark de permalink .

Reacties zijn gesloten.