Бързо и лесно 2-Pass на дълбочината на рязкост

Gnome Depth-Of-Field На дълбочината на рязкост е фотографски ефект, причинен от бленда и фокусно разстояние. Много интересна статия на тази тема е бил публикуван в istockphoto.com . Тя осигурява надеждна дълбочина-бияч за двуизмерен, прогнозираните значими. С други думи: Това прави снимките изглеждат 3D, докато те са все още 2D прогнози.

В сегашното поколение графичен хардуер, е възможно да се направи много фантазия пост-обработка на ефекти - един освен меки сенки и Motion Blur, дълбочината на рязкост (DOF) може да са от от най-често се използва сила за подобряване на качеството на картината. Налице е широк обхват на различни техники за създаване ефекти приятни DOF - просто Google за "дълбочината на рязкост шейдър" ми даде около 74,000 хитове. За демонстрация, исках да напиша, реших да се използва прост, алфа-канал подход, тъй като е проста, бърза и изглежда добре.

Идеята е лесно: Ако вече имате шейдър, който прави неща, като на-пиксел осветление, просто поставете задълбочена информация в алфа канал получения цвят е. Всичко, което трябва да се направи във втория пас: направи отново изображението и размазване на изображението с подходящ ядрото. Както ядрото, избрах Поасон-Disc-филтър с CPU-precomputed данни - това е по-малко "джаги", отколкото с помощта на проста квадратна ядрото, като по-добро качество на картината, с по-малко проби. За да се предотврати лош ореоли около ръбовете на области, които имат високи дълбочина разлики, резултатът не е просто размазани снимки, но фокусно разстояние, също така контролира колко размазване на данни с изображения влязат в крайния резултат.

  vec4 vColor = texture2D (sceneMap, gl_TexCoord [0] XY.);
 плаваш fBlurAmount = ABS (vColor.a * 2.0-1.0);
 плаваш fTexel = 16.0/mapSize;
 vec4 vResult;
 за (Int I = 0; и <16; + + I) {
     vResult + = texture2D (blurMap, gl_TexCoord [0] XY + fBlurAmount * fTexel * Поасон [в] XY * Поасон [в] Z...);
 }
 vResult / = 16,0;
 gl_FragColor = смес (vColor, vResult, fBlurAmount); 

Наясно съм, че този подход е доста ограничено - веднага след като алфа канал е необходима за други ефекти (като светят пас или скорост), тя не може да се използва по този начин. Но така или иначе, аз съм доволен от резултатите. ;)

Този пост беше публикуван в компютърни науки и етикет , , , . Bookmark в постоянна връзка .

Коментарите са затворени.