光线追踪 光栅化为什么不能很好的表示全局效果 软阴影 glossy反射 间接光照 光栅化是一种很快,但相对低质量的 光线追踪是一种准确的,但非常慢 光栅化更多用于实时渲染,光线追踪更多用于离线渲染 光线追踪一帧大概需要10k cpu hour 基础的光线追踪算法 光线是沿着直线传播 光线与光线不会碰撞 光线从光源经过一系列路径到达眼睛,光线传播具有可逆性 光线追踪 连接摄像机的点与屏幕上每一个像素点,形成一条光线 一旦这条光线与某个物体发生相交,连接该点与光源,如果该点不在阴影里,则光路就确定了 最后计算该点的光能量,着色 whitted风格光线追踪 光线在任意一个点可以继续传播,反射或者折射 所有点的着色加在一起,反映在屏幕的某一点 主光线(primary ray): 由摄像机位置直接发出的光线 副光线(secondary ray): 经过反射或者折射形成的新的光线 阴影光线(shadow ray): 从目标点到达光源的光线 求光线与物体表面的交点 光线是由起点和方向定义的: r(t) = o + td,d代表方向,o代表起点,0=<t<无穷大 光线与球体交点: 球的定义,p: (p-c)^2 - R^2 = 0,交点既在光线上,也在球上 (o+td-c)^2-R^2=0 at^2+bt+c=0,a = d * d, b = 2(o-c)*d,c = (o-c)*(o-c) - R^2 用二次函数通用解公式求t,有实数解的前提: b^2 - 4ac > 0,且t >= 0 光线和一般隐式表面求交点: 隐式表面p: f(p) = 0,则f(o+td) = 0,满足实数解,且t>=0 光线与显示表面求交点: 可见性,阴影,光照 判断一个点是否在封闭的物体内,从该点任意射出一条光线,与物体有奇数个交点,则在物体内,偶数个交点,则在物体外 最简单的方法: 一个一个三角形判断是否与光线有交点,但是很慢 只考虑光线与三角形有0或者1个交点 三角形是一个平面 求光线与平面求交点 判断点在三角形内 平面: 定义一个点p'和一个法线N,平面一定过该点,则平面上的点p: (p-p') * N = 0,展开后: ax + by + cz +d = 0 (o+td-p')*N = 0 t=((p'-o)*N)/d*N, t>=0 MT算法,用重心坐标求解t,o+td=(1-b1-b1)*p0+b1*p1+b2*p2,用克拉默法则求解线性方程组,且满足t>0, b1>0, b2>0, 1-b1-b2>0 加速光线和表面求交点 简单判断存在的问题,复杂度为 pixels * objects * bounces,非常慢 包围盒 : 用一种简单的图形包围物体,比如长方体,球体 如果光线连包围盒都碰不到,一定也碰不到里面的物体 对于三维的物体而言,常用的包围盒是长方体 长方体是三个对面形成的交集 通常用到的包围盒叫轴对齐包围盒AABB(Alis-Aligned Bounding Box),长方体的每一条边,都是对应的x, y或者z轴平行的 判断光线与包围盒相交 将3d情况简化为2d,光线与长方形相交 假设光线在tmin0, tmax0与长方形的一对边相交,tmin1,tmax1与长方形的另一对边相交,则求线段(tmin0, tmax0)与(tmin1, tmax1)求交集 考虑3d情况,有3个对面,如何判断光线进入了盒子: 光线要进入盒子,一定是进入了三个对面空间中,光线只要离开任意一个对面,则离开盒子 每一组对面,计算一次光线进入对面的tmin和tmax tenter = max(tmin), texit = min(tmax) 如果tenter < texit,说明光线在盒子内停留过,才有交点 光线不是一条直线,要检查t不为负 如果texit < 0,则盒子在光线背后,不可能有交点 如果texit >=0 且 tenter < 0,则点在盒子内,肯定有交点 总结,光线与AABB有交点,当且仅当tenter < texit && texit >= 0 为什么选择轴对齐的包围盒? 原来的点与面相交的求解是3个分量,6个乘法,1个除法 选用轴对齐的包围盒之后,如果某一个面与x轴垂直,则可以用x轴的分量来计算t,t = (p'x - ox) / dx,,简化为1个分量,1个除法 AABB怎么能帮助加速求交点 找到包围盒 创建grid 将物体存储于格子中,即判断格子是否与物体表面相交 假设光线与格子求交比与物体求交要快 光线经过的格子如果有物体,则求光线与该物体是否有交点 加速效果: 如果只有一个格子,则无效果 如果格子太密集,效率会下降 如果场景中的物体分布均匀,则加速效果会比较好,反之,如果物体分布不均匀,则加速效果会很差 空间划分 oct-tree(八叉树,无相之*): 空间立方体,切3刀,形成八个均等的立方体,然后判断每个立方体中是否有物体,以及物体的个数,决定是否继续切下去,这种方法有个问题,在视觉上看是4叉树,容易搞混 kd-tree(拼多多): 每次只切一刀,而且一直是沿着2个轴切,每次轮换 bsp-tree: 每次切是按一个斜线,计算复杂度较高 kd-tree 数据结构: 每个中间节点都必须 存储split axis: 沿着哪个轴划分x, y, z 存储split position: 划分的位置,划分平面的坐标 存储children: 指向子节点 不存储任何物体 每个叶子节点都必须 存储物体 存在一个问题,很难判断一个格子与哪些三角形有交集 另外一个问题,一个三角形可能与多个格子有交集,则一个物体可能出现在多个格子的叶子结点 BVH - Bounding Volume Heirarchy 本质: 把物体分为两堆,分别重新求包围盒 流程: 找到一个包围盒 递归的把物体拆分成2个部分,并且重新计算包围盒 当叶子结点有足够少的物体,则停止递归 如何去划分一个节点? 选择一根轴去划分 总是选择最长的轴去划分 取中间的物体进行划分,平衡二叉树,或者快速找出中位数,topk算法,快速选择算法 何时停止划分: 当物体个数小于等于5的时候,停止划分 数据结构: 中间节点存储 bounding box: 包围盒 children: 子节点 叶子结点 bounding box: 包围盒 list of objects: 物体 Radiometry - Motivation 辐射度量学的动机 布林冯模型中的光照强度从1到10,这个10是什么? whitted风格的光线追踪是正确的吗? 辐射度量学是给我们精确的光的物理量 辐射度量学 光照单位的测量系统 光在空间中的属性,新的概念: radiant flux, intensity, irradiance, radiance 物理上一个准确定义光照的方法 辐射能量 radiant energy: 电磁辐射的能量,Q,单位J(Joule) radiant flux(power): 单位时间的能量,类似功率 = dQ/dt,单位W(Watt)(lm = lumen) flux: 单位时间内接收光子的量 radiant intensity: 一个光源向外辐射的方向性的能量 irradiance: 物体表面接收到的光的能量 radiance: 光在传播过程中具有的能量 Radiant Intensity power per unit solid angle,每一个单位立体角的power I(w) = do / dw,dw代表角度,do代表power,最终单位[W/sr][lm/sr = cd = candela] angle: 弧度制的角度,o = l / r,弧长除以半径,整个圆为2PI solid angle: 三维空间,dw = dA / r^2,弧面除以半径平方,整个球为4PI 计算方式: dA = (r*da)*(r*sina*db),a为立体角与z轴的夹角,b为立体角绕z轴旋转的角度,单位立体角dw = dA / r^2 = da * sina * db 点光源: I = power / 4PI 有一个灯泡815(lm),则intensity = 815(lm) / 4PI(sr) = 65(candelas) irradiance power per unit area,面与光线垂直 E(x) = dx / dA,单位:[W/m^2][lm/m^2 = lux] 如果面不垂直,E = (dx / dA) * cosa irradiance falloff: E = Ea / 4PI, E' = Ea / (4PI * r^2), Ea表示点光源的power,E表示r为1的情况,只有irradiance在衰减,intensity不衰减 radiance power per unit solid angle, per projected unit area irradiance per solid angle intensity per projected unit area 分两部分,incident radiance 和 exit radiance incident radiance: irradiance per unit solid angle arriving at the surface,从光入射到平面上考虑,平面接收到的power就是irradiance,这个平面可以接收到来自各个角度的光线,现在只考虑一个单位立体角的power,则相当于从该平面接收到一个单位立体角的能量值 exit radiance: intensity per unit projected are leaving the surface,当光从平面辐射出去的情况下,往某一个方向辐射出的power为intensity,现在只考虑平面单位面积的power,则相当于该平面单位面积往一个单位立体角辐射出的能量值 irradiance vs radiance irradiance为面积dA收到的power,radiance为面积dA从单位立体角收到的power,做一次积分,则p点收到的总的power为来自各个单位立体角的power之和,dE(p, w) = Li(p, w) * cosa * dw,dE为irradiance,Li为radiance,a为光线与平面法线的夹角,dw为单位立体角弧度值 BRDF - Bidirectional Reflectance Distribution Function 双向反射分布函数 反射: 一束光线,从某个立体角进入,打到某一单位表面,会被表面吸收,再从表面沿着各个方向辐射出去 BRDF: 辐射角度能量的分布就是BRDF,相当于从radiance(入射),转换为irradiane(吸收),在转换为radiance(辐射) 从各个不同的角度射来的光线(不只是光源,还包含其他物体反射出来的光线,也包含自身作为光源发出的光),到达单位面积,形成的能量和即为该面积的irradiance,然后相机从某一点观察该平面,收到的能量值即为irradiance在该立体角的radiance BRDF也代表着不同反射材质 如果物体本身会发光,则irradiance需要加上该光源的irradiance 渲染方程: 包含自身发光以及其他地方入射光的反射,按算子展开 L = KE + K^2E + K^3E + ...,KE表示直接光照,K^2E表示经过一次反射之后的光照,以此类推 L的值最后一定是收敛的,而不是跟底片曝光一样,底片曝光的本质是光能量在长时间的照射下,趋近于白色,而L是单位时间的一个值 概率论 随机变量: 随机值的变量 概率: 一定大于等于0,随机变量所有取值的概率和为1 期望: 随机变量的值*概率,求和 概率密度函数: 取极小的dx的变化值,f(x)为概率密度函数,则f(x)*dx = 当前x的概率 与概率值相关的函数f(x)的期望,通过概率密度函数的求解 蒙特卡罗积分 在积分域内不断采样,得到的结果求一个平均 采样点越多,结果越准确 求定积分 路径追踪 whitted风格光线追踪存在的问题: 粗糙材质的光线应该如何反射? 漫反射材质之间没有反射,color bleeding whitted风格光线追踪是错的,但渲染方程是对的,需要解决的问题: 半球的积分 递归执行 未提及的概念 photon mapping metropolis light transport VCM / UPBP 重要性采样理论 随机数采样: low discrepancy sequences mis: 多重采样 pixel reconstruction filter gamma correction, curves, color space
Please enable JavaScript to continue using this application.