Shadow Mapping

在确定遮挡关系的时候, z-buffer的深度值是相对于摄像机镜头,也就是眼睛所见来确定物体是否被遮挡,这个很容易理解。眼睛能看不见的地方,当然被挡住了。那我们换个角度想想,阴影是如何产生的?

通过移动视口到光源位置,可以观察到这个位置每个东西都是明亮的,因为从光的角度来看是没有阴影的。从光源的角度将场景的深度渲染到一张深度缓冲区中,我们可以在场景中获得一张阴影或者无阴影的贴图,一张阴影贴图。

软硬阴影

在下面的图中,a点与光源之间没有任何物体遮挡,因此是照亮(lit)的。而地面也就是接受者(receiver)上的 c 点被遮挡者(occluder)立方体遮挡,处于本影区(umbra)。b 点处于被部分遮挡形成的半影区(penumbra)。

光线追踪

为什么选用光线追踪?

光栅化并不能很好的描述全局效果,比如软阴影、间接光照。

光栅化质量不高但特别快,光线追踪则相反。因此主要是离线运算,比如电影等

图形学关于光线的几个假设

  1. 光线沿直线传播
  2. 光线之间不发生碰撞
  3. 光线由光源向眼睛传播

光线跟物体的互动

Whitted-Style光线追踪

几个shadow rays的着色结果都会加回到image plane上

跟隐式表面

跟三维空间中的球面

跟显式表面

跟三角形面

先考虑跟三角形所在的平面求交(与平面上另一点组成的向量与平面法向量垂直),在考虑交点是否在三角形内

包围盒(Bounding Volumes)

将一个包围盒将物体完全包含,如果光线连包围盒都碰撞不了就不用计算与三角形面的碰撞,减少了

那么我们如何计算光线和方块状物体交互

使用三组对面来描述长方体

t_enter= max{t_min} t_exit=min{t_max},已经进入三个对面才算进入盒子,只要离开一个对面就算出去盒子

为啥使用轴对称(Axis-Aligned Bounding Boxes)

减少了大量运算

网格划分

1.找出包围盒

2.创建网格

3.存储与物体重叠的网格

与网格计算求交比物体快很多,只有光线经过有物体的网格才需要与物体求交

空间划分

网格划分仅在场景中物体分布较均匀的时候有较好效果

一个真实的场景中经常有一大块的空白区域,这一大块空白其实可一用一个大格子来覆盖,而其他物体稠密的区域仍然用小格子。

Oct-Tree:八叉树,对于三维空间中的一个场景将其横竖切三刀,切成八块,在二维空间表现为四叉。它的意思就是把包围盒切成四块,然后对于每一个子节点在切成四块,当格子是空的或者格子里面物体足够少时就停止。但是对于高维空间不好划分。

KD-Tree:类似二叉树,每次将包围盒分成两份,每次都是沿着某个轴的方向进行分割,并且分割顺序是x->y->z ->x->y->z……这样循环往复。

BSP-Tree:也是每次划分选择一个方向将空间分成两部分,与KD-Tree相比它不是横平竖直的划分,不好计算

KD—Tree

首先检查光线和场景中最大的包围盒A是否有交点

每次到达叶子结点(规定区域内物体少于多少就不再划分)就与其中的物体求交

可以发现4号区域和5号区域光线没有经过,所以不要和里面的物体进行求交,加速了计算速度。

KD-Tree也有很多缺点:

  • 很难判定一个三角形和包围盒有交集
  • 一个物体可能会在多个格子里,那么在这些格子都要保存这个物体,最后判断这个物体和光线是否相交也要执行很多次。

层次包围盒Bounding Volume Hierarchy(BVH)

BVH按照物体而不是空间来划分

BVH先将物体分为两部分在重新求包围盒,而不是像KD—Tree一样像划分包围盒在考虑物体与盒子的相交情况

划分的依据

  • 为了让包围盒在空间中均匀分布,每次都沿着最长的轴划分。
  • 在第中位数个三角形的位置进行划分,这两部分里面的三角形数量差不多相同,也就是要构造一个平衡二叉树

辐射度量学(basic radiometry)

radiant intensity(辐射通量)

定义:单位立体角上的功率

立体角(solid angle): 辐射的面积除以到圆心的平方——可以形容一个锥展开有多大

candela:发光强度单位

lumen:是描述光通量的物理单位,物理学解释为一candela在一个立体角(半径为1米的单位圆球上,1平米的球冠所对应的球锥所代表的角度,其对应中截面的圆心角约65°)上产生的总发射光通量

也可以使用瓦特(W)表示,单位时间内的能量(Q)

Irradiance(辐照度)

定义: 单位面积上的功率(面与光线垂直)

radiance(辐亮度)

在单位立体角、单位面积上的功率

单位面积(d A)在某个方向上的辐射

Bidirectional Reflectance Distribution Function(BRDF)-双向反射分布函数

反射方程:

但是则会只考虑了光源,其他物体反射的光不会产生影响

渲染方程:

在反射方程基础上加上自身发光

渲染方程不再区分光线是由光源发出还是由物体反射,都把他们当作光源

由图可知,想要解出反射光只有入射光不可知

将这个方程简写为
l(u)=e(u)+∫l(v)K(u,v)dvl(u) = e(u) + \int l(v)K(u,v)dv l(u)=e(u)+∫l(v)K(u,v)dv
再将这个方程简写,使其变为矩阵形式的 递归定义

L=E+KLL = E +KL L=E+KL
用E和K表示L后,再利用二项式定理展开,最后结果为

路径追踪

蒙特卡洛积分

p(Xi)为随机变量Xi的概率密度分布函数,估计值与理论值之间的误差可以通过增加样本数来减小。

将蒙特卡洛积分应用到渲染方程

待解决的问题

弹射光线迅速增多

我们在计算光线的漫反射时,有多个点都会有反射光线到达,再次反射时,所需计算的光线会指数级别增加。

所以我们假设每条N = 1,只有一条路径,以此来做蒙特卡洛积分,这就叫路径追踪

但是只有一条路径产生的画面会有很大的噪声,所以我们在单个像素上追踪足够多的路径来改善画面

采样效率不高

如果我们对着色点进行采样,那么可能追踪的路径只有少数才会到达光源,这样对于光源的采样效率会很低

所以我们直接对光源进行采样,但是渲染方程是对于着色点的,是对于dw的积分

因此我们需要将渲染方程改写为dA的积分,也就是要求出dwdA的转换关系

dwdA在该方向上的投影面积除以他们之间距离的平方

因此考虑两方面的辐射,光源和其他的间接光照。间接光照采用”俄罗斯轮盘赌 “

如何判断光照是否被遮挡

发射一条从x到x’的光线,检测是否被遮挡

games101 光线追踪相关推荐

  1. GAMES101作业5-从头到尾理解代码Whitted光线追踪

    目录 Whitted Ray-Tracing Whitted光线追踪 What Why How 1 发射主射线primary ray 实现步骤 (1)定义相机 (2)计算primary主射线的方向 R ...

  2. games101:七,加速光线追踪(AABB、BVH、SAH)+ 作业6

    games101:七,加速光线追踪(AABB.BVH.SAH)+ 作业6 一,轴对齐包围盒(Axis-Aligned Bounding Box)-AABB 二,Bounding Volume Hier ...

  3. 计算机图形学【GAMES-101】8、辐射度量学与光线追踪

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  4. GAMES101蒙特卡洛光线追踪及Assignment7

    文章目录 前言 蒙特卡洛路径追踪 蒙特卡洛积分 路径追踪 Whitted-Style光线追踪的局限性 渲染方程 直接光照 间接光照 两个问题 优化 总结 Assignment 7 准备工作 实现过程 ...

  5. 计算机图形学GAMES101(十二)光线追踪(基本原理)

    我们是怎么解决阴影问题? 当对物体着色的时候,只考虑了像素点自己,没有考虑物体遮挡.所以着色不能解决阴影.那么怎么解决阴影问题呢? 阴影映射(Shadow mapping) 可以使用阴影映射来渲染阴影 ...

  6. GAMES101复习:光线追踪(Ray Tracing)

    目录 0. 阴影:Shadow Mapping(从光栅化角度实现) ⭐1.光线追踪:光路(线)的可逆性.光的折射.着色贡献度 1.0 Why Ray Tracing?光栅化的局限性 1.1 Recur ...

  7. 闫令琪:Games101 现代计算机图形学-光线追踪(三):渲染方程和路径追踪path ray tracing 作业Assignment07解析

    文章目录 0 whitted光线追踪的局限 1 辐射度量学 1.1 光线的表示 Radiance 1.2 物体表面上一个点的亮度 Irradiance 1.3 BRDF(Bidirectional R ...

  8. 计算机图形学GAMES101(十四)光线追踪(辐射度量学、渲染方程与全局光照)

    本节涉及内容: 辐射度量学(Basic radiometry) 光线的传播:反射方程以及渲染方程 全局光照 为什么要学辐射度量学? 之前使用的Whittled style光线追踪很多物理量都没有精确的 ...

  9. games101,作业5(whitted-style光线追踪)

    任务 你需要修改的函数是: Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相应像素中 ...

最新文章

  1. IBM之alphablox 数据源定义问题解决
  2. DeepEarth中的拖放行为(DragBehavior)
  3. 1.8 欠拟合和过拟合-机器学习笔记-斯坦福吴恩达教授
  4. UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
  5. 人工机器:NDC-谷歌机器翻译破世界纪录,仅用Attention模型,无需CNN和RNN
  6. 数据可视化【四】Bar Chart
  7. 内核电源管理器已启动关机转换_电气器件-菲尼克斯UPS(不间断电源)使用
  8. 固态硬盘怎么看出厂日期_固态到底怎么选?雷克沙NM610和西部数据SN500固态硬盘实测对比...
  9. java商城项目_javaweb实战之商城项目开发(一)
  10. Java编程判断一组学生成绩等级
  11. windows开dump
  12. 旋转研究(矩阵,欧拉角,四元数)
  13. express不是内部或外部命令的解决方法
  14. 带滤镜拍照的app_这8款拍照修图APP,简直就是逼格神器
  15. JAVA 配置文件 路径_Java配置文件读取和路径设置
  16. 关于使用tess4j-OCR识别图片中文教程,亲测可用,不报错
  17. 计算机电源 通电,笔记本电脑开不了机,通电后电源指示灯不亮
  18. 【小技巧】腾讯QQ——腾讯网迷你版弹窗
  19. java是什么?带你了解
  20. 以太网络(网口)变压器简介,功能,结构及典型的以太网网口电路

热门文章

  1. krypton(0-6)
  2. 【JDBC篇】Java连接数据库的五种方式,及什么是URL?
  3. 2021-2027全球与中国光纤布拉格光栅放大器市场现状及未来发展趋势
  4. NET是什么????
  5. java汽车美容管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  6. 电脑自带的相机软件打开黑屏
  7. 网页数据压缩(python deflate gzip),解压缩
  8. spring 锁机制
  9. RestTemplate深入浅出
  10. Swift 系统学习 09 repeat while