计算机图形学--笔记3

课程往后难度上升,听不懂需多查资料

光线追踪1

光栅化的时候,全局的光照效果不好做,所以引入光线追踪技术。

例如这些全局效果:软阴影、毛玻璃状的镜面反射效果、光线多次弹射的间接光照

光栅化与光线追踪的比较

光栅化:实时的、渲染速度快、质量一般

光线追踪:离线的、渲染速度慢、质量高

基本光线追踪算法

首先,重新假设光线——沿直线传播、光线与光线不会碰撞、光是可逆的

基本光线追踪做法:从眼睛发射射线,打到物体上某一点,判断从光源处发光能否打到物体上该点,能,则说明光源能照到物体上;否,则说明该点在光源的阴影中,最后计算着色结果写回像素颜色中。

whitted-style 光线追踪

对于屏幕中的每一个像素,从世界空间中的观测点发出光线,光线经过模型的每一个交点,都与光源连线(如果被遮挡,就不计算颜色),计算颜色,叠加到像素上。(类似于递归的结构)

在这里插入图片描述

从观测点发射光线,需要将光栅化后的像素,转化为齐次裁剪空间->屏幕空间->世界空间

光线与物体表面相交

首先,利用光源的起点 O 和方向向量 d,定义一根光线

r ( t ) = O + t d 0 < = t < = ∞ \mathbf{r}(t)=\mathbf{O}+t\mathbf{d}\quad0<=t<=∞ r(t)=O+td0<=t<=

把光线看成一堆点的集合,光线上的点的位置,随时间 t 变化而变化

光线与球的相交

写出 c 为圆心、R 为半径、p 为球上一点的球的表达式: ( p − c ) 2 − R 2 = 0 (p-c)^2-R^2=0 (pc)2R2=0

光线与球相交时, p 点同时满足光线的表达式和球的表达式

解二次方程 ( o + t d − c ) 2 − R 2 = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-R^2=0 (o+tdc)2R2=0 即可

光线与隐式表面相交

隐式表面的表达式,可以写成 f ( p ) = 0 f(\mathbf{p})=0 f(p)=0

然后同上,与光线的表达式联立,求出正的实数根就得到交点了。

光线与三角形网格求交

就是光线与三角形网格的每一个三角形面求交。

首先,判断光线与三角形面相交,可以拆分成两个步骤:

① 光线是否与三角形面所处的平面相交

② 交点是否落在三角形内

设 p’ 是平面内一点,N 是法线,平面的表达式为 ( p − p ′ ) ⋅ N ⃗ = 0 (\mathbf{p}-\mathbf{p'})·\vec{N}=0 (pp)N =0

光线与平面相交时,满足方程 ( O + t d − p ′ ) ⋅ N ⃗ = 0 (\mathbf{O}+t\mathbf{d}-\mathbf{p'})·\vec{N}=0 (O+tdp)N =0

解得 t = ( p ′ − o ) ⋅ N ⃗ d ⋅ N ⃗ t=\frac{(p'-o)·\vec{N}}{d·\vec{N}} t=dN (po)N

然后判断交点是否落在三角形内即可。


另一种算法是 Moller Trumbore 算法,就是直接用光线表达式和三角形重心坐标来计算

加速计算

一个物体有非常多三角形面,如何加速计算光线与每一个三角形面的求交

直接逐像素计算每个三角形面与光线是否相交,运算量太大,有什么办法加速计算?

包围盒

先用包围盒把复杂物体围起来,计算光线追踪时,只有与包围盒相交时,才继续计算包围盒里面的物体,否则跳过——这样就可以做加速计算

轴对齐包围盒 AABB ,意思是盒子的长宽高三个轴,分别跟 XYZ 坐标轴对应

光线与包围盒相交

光线继续采用某一时刻内的位置向量表示,把包围盒看成是 3 组平面,在每一组平面内可能存在首次进入包围盒的时刻 t m i n t_{min} tmin、离开包围盒的时刻 t m a x t_{max} tmax

确保光线完全进入包围盒、光线首次离开任意包围盒平面,求出 t e n t e r = m a x ( t m i n ) t e x i t = m i n ( t m a x ) t_{enter}=max(t_{min})\quad t_{exit}=min(t_{max}) tenter=max(tmin)texit=min(tmax) 表示最晚进入盒子、最早离开盒子的时刻

总结发现,当 t e n t e r < t e x i t & & t e x i t > = 0 t_{enter}<t_{exit}\quad\&\&\quad t_{exit}>=0 tenter<texit&&texit>=0 时,光线才与包围盒相交

作业5 光线与三角形面相交

作业内容是如何生成每个像素从观测点发射的光线、利用 Moller Trumbore 算法判断光线与三角形面相交

参考链接1

参考链接2

光线追踪2

AABB 轴对齐包围盒,具体如何加速光线追踪的计算?

均匀网格

直接将包围盒划分成均匀的网格,将物体表面信息存储到网格中。

光线进入包围盒中,会经过一系列网格。

其中,当光线经过内部存有物体表面信息的网格时,需要进行下一步计算,判断光线是否与网格内的物体表面相交;光线经过内部没有物体表面信息的网格时,则不需要进行计算。

这里将包围盒划分为多少个均匀网格比较合适?太多太少都不合适。一般取 27 乘上包围盒中物体个数。

均匀网格,适用于场景中物体分布比较均匀的情况。

空间划分

按照包围盒内物体在空间中分布情况,细化网格,有三种常见划分方式:八叉树、KD树、BSP树

在这里插入图片描述

八叉树:包围盒按行列中央,均匀划分四块区域,不断细分,按指数级增长

KD树:包围盒按行列,不均匀划分区域,区域内有多个物体时才划分,是八叉树的改进版。使用最多。

在这里插入图片描述
只在叶子节点存储物体表面

BSP树:包围盒沿斜线划分,计算复杂

上面三种划分空间的方法,都存在局限性,例如一个物体存入多个网格中,浪费资源。

因此提出按照物体来划分的方法。

BVH 划分

构建一种包围体积的层次结构,每个物体就只存储一次

在这里插入图片描述
具体如何生成这样的包围体积结构?递归地划分,知道包围体积中物体数量较少。

法一:每次沿着最长的轴划分

法二:每次找到排在中间的物体进行划分

作业6 光线与包围体积的相交、BVH查找

参考链接1

参考链接2

辐射度量学

前面在光照模型时,没有细究光线传播的能量。

现在要想做到更真实的光线效果,就需要对光线定义一系列物理量。

Radiant flux :辐射通量,光线在单位时间的辐射能量

在这里插入图片描述
Radiant Intensity :辐射强度,光线在单位立体角对应的辐射通量

在这里插入图片描述
立体角:物体在特定点的三维空间角度

在这里插入图片描述
对于均匀发光的点光源,可以写出它的 Radiant Intensity

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值