基于光线追踪的渲染中景深(Depth of field)效果的实现
图形学离线渲染中常用的透视摄像机模型时根据小孔成像的原理建立的,其实现通常是从
向成像平面上发射ray,并把trace这条ray的结果作为成像平面上对应交点的采样结果。即:

图片来自《Fundamentals of Computer Graphics》
现实中的镜头拍摄的图像有景深(Depth of field)的效果,譬如:

图片来自网络
显然,上图中的耳机被放在摄像机的焦平面附近,成像很清晰;背景中的景物则离焦平面较远,呈现出模糊的效果。对离线渲染而言,这一效果有利于加强渲染结果的真实性和层次感。但之前提到的摄像机模型过于简单,要得到景深,需要更精确的摄像机模型。

图片来自网络
上图是网络上给出的关于景深的一张示意图,看起来复杂骇人。但稍微分析就能知道,使得不在焦平面上的景物显得模糊的最根本原因恰恰是焦平面的概念本身,如下图——

图片来自网络
可以看到,假如在原来的透视摄像机模型中加入一个凸透镜,那么成像过程将不再是“一根”光线穿过小孔到达成像平面上的一点,而是许多光线透过凸透镜汇聚到成像平面上的一点。

物体恰好在焦平面上的情形
显然,假如有一物体正好在焦平面上,那么从上面某一点发射的光线通过凸透镜在成像平面上也会汇聚于一点,于是就得到了清晰的图像。但是,当物体不在焦平面上时,汇聚到成像平面上某一点的光线将不再全部来自于物体上的一点,而是来自于物体上的一小片区域,这就形成了模糊的效果,也就是最终看到的景深。

物体不在焦平面上的情形
有了这一模型,要设计渲染出景深效果的算法就很容易了。以往从透视摄像机发射ray的方法是:
对成像平面上的一点
,发射射线
,其中
,
是
点位置。
新的方法则是:
对成像平面上的一点
,求出射线
与焦平面的交点
,然后在凸透镜上随机采样(把凸透镜看做有一定半径的圆盘)。对每一个采样点
,发射射线
。
新方法实质是在凸透镜所在的disk上对到达成像平面上特定点的能量用蒙特卡洛的方法进行了估值。
基于光线追踪的渲染中景深(Depth of field)效果的实现的更多相关文章
- 景深(Depth of Field)
http://www.cnblogs.com/cxrs/archive/2013/03/22/DepthOfFeild.html 景深(Depth of Field) 什么是景深? 所谓景深,就是当焦 ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- PBR(基于物理的渲染)学习笔记2
相关资料 https://www.cnblogs.com/dojo-lzz/p/13237686.html 文档:PBR学习笔记.note 链接:http://note.youdao.com/note ...
- 基于物理的渲染——间接光照
在前面的文章中我们已经给出了基于物理的渲染方程: 并介绍了直接光照的实现.然而在自然界中,一个物体不会单独存在,光源会照射到其他的物体上,反射的光会有一部分反射到物体上.为了模拟这种环境光照的形式,我 ...
- PBR(基于物理的渲染)学习笔记
PBR基本介绍 PBR代表基于物理的渲染,本质上还是 gl_FragColor = Emssive + Ambient + Diffuse + Specular 可能高级一些在考虑下AO也就是环境光遮 ...
- PBR:基于物理的渲染(Physically Based Rendering)+理论相关
一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...
- 离线渲染中的不规则光源(Meshlight)
之前一直在考虑这样一个问题,在实际生活中的光源都是有体积的,但是图形学中,很多时候我们用简单的点光源,面光源,或者方向光来模拟实际生活中这些光源,势必会产生一些误差,同时导致很多效果不好做.那么在离线 ...
- Unity3D图像后处理特效——Depth of Field 3.4
Depth of Field 3.4 is a common postprocessing effect that simulates the properties of a camera lens. ...
- 如何让IOS中的文本实现3D效果
本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9 zh ...
随机推荐
- C++ STL——异常
目录 一 C++异常机制概述 二 栈解旋(unwinding) 三 异常接口的声明 四 异常类型和异常变量的生命周期 五 C++标准异常库 六 异常的继承 注:原创不易,转载请务必注明原作者和出处,感 ...
- Tween(补间)动画
视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置.大小.旋转.透明度).譬如,如果你有一个TextView对象,您可以移动.旋转.缩放.透明度设置其文本,当然,如果它有 ...
- backbone之module
上一篇列出了collection的代码,下面要把代码进行分离 //先是app.js var ContactManager = new Marionette.Application(); Contact ...
- 启动eclipse导致Tomcat的配置文件重置
转: 启动eclipse导致Tomcat的配置文件重置 导入一个项目,需要在Tomcat的配置文件中配置JNDI数据源,需要修改Tomcat下的server.xml文件.但是当我们修改完后重启Tomc ...
- JAVA 自定义对象集合 List<T> 根据自定义字段去重
1.拥有自定义对象 MyUser @Data public class MyUser { private String userName; private String passWord; } 2.编 ...
- ElasticSearch——Logstash输出到Elasticsearch配置
位置 在Logstash的.conf配置文件中的output中配置ElasticSearch 示例: output { elasticsearch{ action => "index& ...
- avast关闭DeepScreen
在“设置”-“防病毒”-去掉“启用 DeepScreen”.
- Spring Boot Mybatis简单使用
Spring Boot Mybatis简单使用 步骤说明 build.gradle:依赖添加 application.properties:配置添加 代码编写 测试 build.gradle:依赖添加 ...
- python实现迭代法求方程组的根
有方程组如下: 迭代法求解x,python代码如下: import numpy as np import matplotlib.pyplot as plt A = np.array([[8, -3, ...
- U盘ios系统制作
首先我们先安装软碟通,完成安装后打开软碟通,文件->打开,打开我们的iso镜像 步骤阅读 然后选择我们的U盘 步骤阅读 然后点击启动->写入硬盘映像 步骤阅读 写入方式有zip ...