A profundidade de campo é um efeito fotográfico causada pelo comprimento da abertura e focal. Um artigo muito interessante sobre este tema foi publicado em istockphoto.com . Ele fornece uma profundidade de sinalização fiável para bidimensional, material projectada. Em outras palavras: Ela faz fotos com aspecto 3D, enquanto eles ainda são projeções 2D.
Na atual geração de hardware gráfico, é possível tornar um monte de efeitos de pós-processamento de fantasia - um sombras além de refrigerantes e O borrão de movimento, profundidade de campo (DOF) pode estar no do efeito mais frequentemente usado para melhorar a qualidade visual. Há uma grande cobertura em diferentes técnicas para a criação de efeitos DOF agradáveis - um google simples para "profundidade de campo shader" me deu um sobre 74.000 hits. Para uma demonstração que eu queria escrever, eu decidi usar uma abordagem simples, baseada em canais alfa, porque é simples, rápido e bonito.
A idéia é simples: Se você já tem um shader que faz coisas como per-pixel-iluminação, basta colocar a informação de profundidade no canal alfa da cor resultante. Tudo o que tem que ser feito no segundo passo: tornar a imagem novamente e desfocar a imagem com um kernel apropriado. Como kernel, eu escolhi um Poisson-Disc-Filter com dados CPU-precomputed - este é menos "irregular" do que usando um kernel quadrática simples, dando uma melhor qualidade visual menos amostras. Para evitar desagradáveis halos em torno das bordas das áreas que têm alta profundidade diferenças, o resultado não é simplesmente uma imagem tremida, mas a distância focal também controla a quantidade de dados de imagens borradas entrar no resultado final.
vec4 vColor = Texture2D (sceneMap, gl_TexCoord [0] xy.); flutuador fBlurAmount = abs (vColor.a * 2,0-1,0); flutuador 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); Estou ciente de que esta abordagem é bastante limitado - assim como o canal alfa é necessário para outros efeitos (como um passa-brilho ou velocidade), ele não pode ser usado como este. Mas de qualquer forma, estou feliz com os resultados. ![]()
| |

















































