图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
图形学笔记(十二)光线追踪2——使用AABB包围盒加速光线追踪、空间划分(八叉树、KD树、BSP树)、物体划分(BVH加速结构)、光线与物体求交
1 Shadow Mapping与光线追踪
1.1 Shadow Mapping
1.1.1 概览
Shadow Mapping本质是一种图像空间的算法。
关键思想
不在阴影中的点必须可以同时被摄像机和光源看到。
1.1.2 Shadow Mapping步骤
1> 从光源渲染
从光源看场景,获得深度图(z-buffer)。
2> 从摄像机渲染
从摄像机看场景,对于每一个看到的点,将其映射回光源渲染的深度图上, 比较从光源到这个看到的点的深度和其在深度图上对应的深度,若深度一致,说明这个点可以同时被光源和摄像机看到。
1.1.3 Shadow Mapping结果
如下图非绿色的是阴影应该在的地方。
1.1.4 Shadow Mapping的问题
- 生成的是硬阴影(只对点光源)。
- 阴影的效果取决于shadow map的分辨率。
- 涉及浮点精度比较的问题。
1.2 软阴影和硬阴影
1.2.1 概览
如下图,左边是硬阴影(界限比较清晰),右边是软阴影。
1.2.2 软阴影的原理
由于点光源有大小,会形成如图所示的(Umbra)本影区域和半影(Penumbra)区域。所以会形成阴影的过渡。
1.3 进行光线追踪(Ray Tracing)的原因
光栅化不能很好的处理全局效果(如下图所示)。
-
难以做软阴影。
-
难以表现光线多次弹射,比如间接光照。
-
光栅化很快但是质量较低
-
光线追踪很准确,但是很慢
光栅化:实时(游戏),光线追踪:离线(动画)。
光线追踪一帧就要花10K个计算机小时
2 光线追踪算法
2.1 光线(图形学角度做的假设)
- 光线沿直线传播。
- 光线和光线不会发生碰撞。
- 光线会从光源发出,打到场景中,经过反射折射等最终进入人眼(光线具有可逆性)。
2.2 光线投射(Ray Casting)
光线投射是光线追踪中用于生成初始光线的第一步。
- 通过从每一个像素发射光线来生成图像。
- 通过从光源发射光线来检测阴影。
从视点开始经过像素获得与场景中物体最近的交点。
和光源连线,判断是否对光源可见从而确定该点是否在阴影中。
然后计算着色,写回像素结果。
2.3 Recursive(Whitted- Style) Ray Tracing
此算法在79年渲染1帧用了74min、06年PC需要6s、12年的GPU需要1/30s。
此算法要考虑反射和折射的光线,如下图所示。
对每一个弹射点都要计算着色的值,然后把所有着色的值都加到像素的值里面去。
光线有不同的分类:primary ray、secondary ray、shadow ray。
3 光线与物体的交点 Ray-Object intersections
3.1 基本概念
3.1.1 光线
光线在数学上是有起点和方向的射线,表达式如下,t代表时间。
3.1.2 平面
通过一个法向量和一个平面上的点来进行定义。
平面的表达式 平面是满足下面条件所有p点的集合。
p : ( p − p ′ ) ⋅ N = 0 p:(p-p')·N=0 p:(p−p′)⋅N=0
3.2 光线与球求交
光线与球的交点p,必须要满足p既在光线上也在球上。
球的表达式如下:
将光线方程代入,获得如下等式:
最后求得(解的的t代入参数方程就是交点):
3.3 光线和隐式表面求交
如果隐式表面的表达式
P : f ( p ) = 0 P:f(p)=0 P:f(p)=0
则把这个式子代入光线等式,得到 f ( o + t d ) = 0 f(o+td)=0 f(o+td)=0
解出来结果t,即可得到交点(t必须是实数,也要是正数)。
3.4 光线和三角形面求交
3.4.1 原因
光线和三角形求交有如下作用:
- 渲染:可见性、阴影、光照…
- 几何:可以判断点是再物体内还是物体外。
对任何一个封闭的曲面,在内部找一个点,如果点在形状内,那么从这个点发出的任意方向的射线与此物体的交点数量一定是奇数。
3.4.2 算法(与平面求交再判断是否在三角形内)
简单的办法是让场景中的每个三角形与光线进行求交计算,但是有如下严重问题。
- 简单但是运算量大。
- 可以有0或1个交点。
如果想要计算光线和三角形面的交点,因为三角形在平面内,所以可以把光线和三角形求交拆成两个问题:
- 让光线与平面求交(目前与平面求交比与三角形求交容易)。
- 判断与平面的交点是否在三角形内。
让光线与平面求交 将 p = r ( t ) p=r(t) p=r(t)代入平面的表达式(t是正实数),结果如下。
t = ( p ′ − o ) ⋅ N d ⋅