Lalim ng Patlang ay isang photographic epekto dulot ng siwang at focal length. Isang napaka-kagiliw-giliw na artikulo tungkol sa paksang ito ay nai-publish sa istockphoto.com . Ito ay nagbibigay ng isang maaasahang lalim-cue para sa dalawang-dimensional, inaasahang materyal. Sa ibang salita: Ito ay ginagawang mga larawan tumingin 3D habang ang mga ito ay pa rin 2D projection.
Sa kasalukuyang henerasyon ng mga graphics hardware, posibleng mag-render ng maraming magarbong post-processing effect - bukod sa isang malambot na mga anino at mga paggalaw lumabo, depth ng patlang (DOF) ay maaaring maging sa mga pinaka-madalas na ginagamit na epekto upang mapahusay ang visual na kalidad. May isang malawak na saklaw sa iba't ibang mga diskarte sa paglikha ng mga kasiya-siya epekto DOF - isang simpleng google para sa "depth ng patlang shader" Ibinigay sa akin ang tungkol sa 74.000 hit. Para sa isang demo Nais kong isulat, ako nagpasya na gumamit ng isang simple, alpha-channel diskarteng batay sa sapagkat ito ay simple, mabilis at mukhang maganda.
Ang ideya ay madali: Kung ikaw ay mayroon ng isang shader na ginagawa ng mga bagay tulad ng per-pixel-lighting, ilagay lamang ang malalimang impormasyon sa alpha channel ang lalabas na kulay ni. Ang lahat ng iyon ay may sa gawin sa pangalawang pass: render ang imahe muli at lumabo ang mga imahe na may angkop kernel. Tulad ng kernel, ako pumili ng isang Poisson-Disc-Filter sa CPU-precomputed data - ito ay mas "may mga tulis" kaysa sa paggamit ng isang simpleng parisukat kernel, na nagbibigay sa mas mahusay na visual na kalidad sa pamamagitan ng mas kaunting mga sample. Upang maiwasan ang makukulit halos sa paligid ang mga gilid ng mga lugar na may mataas na-depth pagkakaiba, ang mga resulta ay hindi lamang isang Malabong larawan, ngunit ang focal-haba din kumokontrol sa kung gaano karaming Malabong larawan makakuha ng data papunta sa huling resulta.
vec4 vColor = texture2D (sceneMap, gl_TexCoord [0] xy.); lumutang fBlurAmount = abs (vColor.a * 2.0-1.0); lumutang fTexel = 16.0/mapSize; vec4 vResult; para sa (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);
Ako ng kamalayan na ang diskarteng ito ay medyo limitado - sa lalong madaling ang alpha channel ay kailangan para sa iba pang mga epekto (tulad ng isang glow-pass o kabilisan), hindi ito maaaring gamitin tulad nito. Ngunit pa rin, ako masaya sa resulta. ![]()
| |

















































