一、从透镜说起

透镜是一种将光线聚合或分散的设备,透镜一般分为两类,中间厚边缘薄的叫凸透镜,中间薄边缘后的叫凹透镜;也可以根据光线折射的类型分为汇聚透镜,发散透镜;

通常,透镜是有两个面的(面镜只有一个面),因此可以再细分为双凸透镜,双凹透镜,平凸透镜,平凹透镜,凹凸透镜,双月透镜(两个面的曲率相同)等。透镜导致的光学折射现象非常多,我们自己也可以尝试去实现一些透镜效果,如放大镜效果、近视眼镜效果、鱼眼效果、雨滴的折射等;

光心:透镜的物理中心,通常经过光心处的光线我们会假设它不会改变方向

光轴:透镜前后表面的球面中心点的连线称为透镜的光轴

凸透镜,一束光以平行于光轴的方向照射后会在另一侧集中于一点,这一点就是焦点,该点到镜心的距离就是焦距。

成像、物距、焦距、实像、虚像、对焦、失焦等简单概念,可自行查询,https://baike.baidu.com/item/%E5%87%B8%E9%80%8F%E9%95%9C%E6%88%90%E5%83%8F%E8%A7%84%E5%BE%8B

凸透镜成像:光线经过透镜后汇聚在一点,一个物体的所有光线经过透镜后就形成了一个实像(也可能是虚像,这里只考虑实像情况);

但是需要注意的是,只有焦平面上的点才能映射到像平面上,而像平面通常就是胶片的位置,如下图所示,P点作为焦平面上的点是可以被清晰成像的;

但是,对于不在焦平面上的点,它的光线不能汇聚成一点,因此就会出现模糊的现象,这就是失焦,和焦平面距离越远的点失焦情况就越严重;这里焦平面到光心的距离就是物距,而像平面到光心的距离就是像距。焦距和像距之间有一个固定的关系(,其中u为物距,v为像距,f为焦距;),通常所说的调焦也就是调整两者大小来进行对焦。

二、计算机中的景深

在计算机图形学中,我们使用的虚拟相机通常是类似于针孔相机的,特点就是镜头尺寸为零,光从场景到胶片的路径只有一条。这种情况下就不会出现景深的效果,因此要模拟这种效果,就需要为数字相机加入更多的特性。

如下两张图是对景深模糊一个比较直观的解释,

景深的定义和相关参数

景深是指相机对焦点前后相对清晰的成像范围。在光学中,尤其是录像或是摄影,景深用于描述在空间中,可以清楚成像的距离范围。虽然透镜只能够将光聚到某一固定的距离,远离此点则会逐渐模糊,但是在某一段特定的距离内,图像模糊的程度是肉眼无法察觉的,这段距离称之为景深。

景深通常由物距、镜头焦距,以及镜头的光圈值所决定(相对于焦距的光圈大小)。除了在近距离时,一般来说景深是由物体的放大率以及透镜的光圈值决定。固定光圈值时,增加放大率,不论是更靠近拍摄物或是使用长焦距的镜头,都会减少景深的距离;减少放大率时,则会增加景深。如果固定放大率时,增加光圈值(缩小光圈)则会增加景深;减小光圈值(增大光圈)则会减少景深。

https://photography.tutsplus.com/articles/understanding-the-factors-that-affect-depth-of-field--photo-6844

景深和表现效果

景深越大,在景深范围内的物体就越多,模糊效果就越不明显;相反,景深越小,聚焦效果就越明显,模糊效果也就越明显;

景深的实现技术

分层景深:将对象基于深度分为若干个层,模糊每个层以后将这些图层合成一张图像;这种方式的实现比较简单,但是会产生很多伪像。

前向映射Z-Buffer:这个术语我也翻译不准确,但是是景深实现中比较通用的技术,也是本文后面重点介绍的,它的基本思路是:基于深度图来计算每个像素的CoC值,通过CoC值来判定焦点区域以及焦外区域,对焦外区域做散景模糊(一种图像模糊算法);

三、景深的具体实现

catlikecoding教程中实现了一个和unity后处理插件中相似的DOF效果,这里贴出原文以及一篇译文供学习参考;

https://catlikecoding.com/unity/tutorials/advanced-rendering/depth-of-field/

https://ak-techartist.github.io/2018/04/25/depth-of-field/

这里会大概总结一下实现的关键步骤以及为了优化效果等解决的关键问题;

1.CoC的处理

首先拿到深度值,然后设定一个焦距以及景深范围;这里把所有的值截取到-1和1,小于0为前景,大于0为背景

float coc = (depth - _FocusDistance) / _FocusRange;
coc = clamp(coc, -1, 1);

2. 焦外效果

焦外效果主要就是一个模糊效果,所以在文章中花了很大篇幅讲述它是如何一点点得到一个不错的散景效果的;

在做模糊效果时,卷积核的大小以及迭代次数都会对性能有明显消耗,这里为了兼顾性能和效果使用的是一个自定义的卷积核,并且对图像提前做了降采样(通过降采样再升采样可以模糊,并且降采样可以减少散景模糊的计算消耗);

3.对焦

有了焦外效果,这是就需要根据CoC值来决定各个像素的效果显示了,通过将CoC的值和卷积核半径的值来进行比较,来判断某一点对当前像素的影响,这里主要的一个优化是,对于是否受到某一点的影响不是简单的取舍,而是采用了权重计算的方式,这样能得到一个更平滑的效果;

另外,由于我们的模糊是全局模糊了,会导致焦点内的像素也是模糊的,因此需要通过source纹理和dof纹理(焦外模糊的纹理)做一个混合来做一个锐化的效果;如下,使用coc值的绝对值来做一个插值计算:

half4 source = tex2D(_MainTex, i.uv);
half coc = tex2D(_CoCTex, i.uv).r;
half4 dof = tex2D(_DoFTex, i.uv);half dofStrength = smoothstep(0.1, 1, abs(coc));
half3 color = lerp(source.rgb, dof.rgb, dofStrength);
return half4(color, source.a );

4.前景和后景分开处理

上述方式会有一个严重的问题,如下所示,我们可以看到在箭头所指处,也就是一个焦外前景在一个焦点背景之上的时候,由于这时的CoC值还是背景的CoC值(因为CoC纹理并没有做这种模糊,模糊效果只是焦外自己处理的),那么本来应该前景模糊在背景之上,这里就出现了问题;

这个效果不正确的主要原因不在于那个混合因子,而是我们的焦外模糊的计算是有问题的,我们在之前的计算中忽略了前景模糊应该覆盖背景这一特点,而是将前景模糊和背景模糊的卷积计算混在了一起;因此,解决这个问题的思路就是区分前景和背景,然后在合并前景和背景时采取前景覆盖背景的方式即可。

四、参考

GPU Gems:景深的一些实现技术

高品质后处理:十种图像模糊算法的总结与实现

Unity景深效果解析相关推荐

  1. unity 景深效果

    可以在unity中window→Package Manager,找到Post Processing插件 然后通过此插件就可以调整景深效果了 注意 摄像机上需绑定 Post Process Layer ...

  2. 用Unity实现景深效果

    用Unity实现景深效果 景深也是一种非常常见的后处理手段,它用来模拟相机拍摄画面的效果.今天我们讨论如何在Unity中实现它. 简单来说,景深效果可以拆分为两个部分,一个部分是聚焦,使画面中指定的区 ...

  3. Unity 屏幕特效 之 简单地使用 Shader 获取深度,实现景深效果

    Unity 屏幕特效 之 简单地使用 Shader 获取深度,实现景深效果 目录

  4. (一)unity shader在实际项目中出现的问题————unity的后处理插件景深效果在某些低档机(如三星)无效的解决方案

    本专栏主要解决一些移动平台上unity shader效果异常的问题.很多情况下我们发现unity中的shader在PC平台效果正常,但是在移动平台上效果不对,或者部分机型效果不对的问题,尤其是低档老年 ...

  5. unity shader景深效果

    实现效果 景深效果 实现思路 由两张图组成,分别是远处的模糊状态和近处的清晰状态,根据物体的深度判断物体离摄像机的距离确定物体的状态.两个图进行插值,越近越靠近清晰的图像. 代码 脚本代码: usin ...

  6. 彩虹6号 计算机服务设置,彩虹六号围攻各选项效果解析与设置建议 画面优化设置方法...

    彩虹六号围攻的画面设置界面有很多选项,分别控制着不同的显示效果,不少玩家由于机器配置或是游玩体验不佳而不知道应该如何设置画面,于是小编就为大家带来了彩虹六号围攻画面设置完全指南,包含各选项效果解析与设 ...

  7. Unity 景深Depth Of Field

    目录 介绍 准备 设置 基于Unity Builtin 管线 基于Unity URP 基于Unity HDRP 介绍: 景深效果Depth Of Field是摄影界的老常客了,在游戏中也非常多见,它能 ...

  8. Unity景深Depth of field优化,得到清晰边界

    Unity景深模拟的实现大都是, 1.先获取屏幕后期纹理,然后复制出来进行高斯等方式模糊. 2. 再根据场景物体的深度纹理, 在着色器中对景深需要清晰的目标为切割获取0-1的深度插值. 3.将屏幕后期 ...

  9. Unity镜子效果的实现(无需镜子Shader)

    Unity镜子效果制作教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

最新文章

  1. 定制化Azure站点Java运行环境(2)
  2. FIR滤波器的Matlab实现
  3. 网站外链如何发布才能更快的得到高排名呢?
  4. 支持向量机: Kernel
  5. 音视频技术下一个风口在哪里——LiveVideoStackCon 音视频技术大会 2022 上海站演讲剧透...
  6. 【计算机组成原理】补码的加减运算方法
  7. 大学考试分数越高学分越多吗_大学的绩点和学分有什么用?影响学生毕业吗
  8. 高并发库存秒杀场景,阿里巴巴数据库是这样应对的
  9. 复习:线性表——顺序表
  10. (十六)企业部分之lvs
  11. Git VsCode 一步一步把本地目录放到git仓库
  12. [企业管理]邮政系统,真得悲哀呀!居然歪曲理由掩盖事实
  13. wps下一步快捷键_办公必备|终于整理完了这74个WPS最常用快捷键
  14. 字体识别在线工具-整理
  15. html把div做成透明,Html-Css-div半透明
  16. android简单悬浮窗源码,Android 悬浮窗的实现源码
  17. python 因果推断_微软因果推理框架DoWhy入门
  18. 【upc】Water Testing 皮克定理+多边形面积公式
  19. 互联网+大赛作品_“颂中国力量 绘美好梦想”全市中小学生互联网+书画大赛作品展示(十)...
  20. NLP NLU NLG 简介

热门文章

  1. SyntaxError: Missing parentheses in call to 'print' 问题原因
  2. So easy!非技术人员也能学会的土狗防骗技巧!
  3. 地表反射率影响因素_地理简答题气候因素
  4. Python语言程序设计 - 北京理工大学 网课所有资料(源码,pdf,ppt课件,视频等)
  5. 白平衡,及白平衡调节过程
  6. 什么是pptp,什么是vps?两者有何区别?
  7. 远程控制电脑软件有什么特别之处呢?
  8. 巴西柔术第六课:侧向压制上位进攻技术
  9. 和讯金融界证券之星 财经网站竞争格局突变
  10. 【Java】Java编译时错误:A JNI error has occurred, please check your installation and try again