Whitted-Style Ray tracing
为什么要光线追踪
-
光栅化不能很好地处理全局效果
- 软阴影
- 尤其是当光线反射不止一次的时候
![![[Pasted image 20241213175934.png]]](https://i-blog.csdnimg.cn/direct/eb3e2ece43634b5a91fe509f8d264a62.png)
-
栅格化速度很快,但质量相对较低
-
光线追踪是准确的,但速度很慢
- 光栅化:实时,光线追踪:离线
- ~10K CPU核心小时来渲染一帧
基本光线追踪算法
光线
关于光线的三个观点:
- 光沿直线传播(虽然这是错误的)
- 光线交叉时不会相互“碰撞” (尽管这仍然是错误的)
- 光线从光源传播到眼睛(但物理在路径反转-互易下是不变的)。
“And if you gaze long into an abyss, the abyss also gazes into you.” — Friedrich Wilhelm Nietzsche (translated)
视觉发射理论
光线追踪
Appel 1968 -光线追踪
- 通过每个像素投射一条光线来生成图像
- 通过向光源发送光线来检查阴影

产生眼睛射线
针孔相机模型

阴影像素(仅限局部)

从观察点往成像平面的每个像素位置投射光线,再从投射光线与场景物体的交点向光源位置投射光线判断交点是否在阴影里。
递归(Whitted-Style)光线追踪
“An improved Illumination model for shaded display” T. Whitted, CACM 1980
Time:
- VAX 11/780 (1979) 74m
- PC (2006) 6s
- GPU (2012) 1/30s

一个递归的Ray Casting 方法,在Ray Casting假设的基础上考虑光线进一步的反射与折射。在每一个交点出都考虑光源的阴影着色,最后将这些点的着色累加作为该像素位置的成像结果。

光线-表面交点
光线方程
光线由它的原点和方向向量定义

r(t)=o+td,t≥0 r(t)=o+td,t\ge0 r(t)=o+td,t≥0
射线与球面相交
光线:r(t)=o+td,t≥0\mathbf{r}(t)=\mathbf{o}+t\mathbf{d},t\ge0r(t)=o+td,t≥0
球:p:(p−c)2−R2=0\mathbf{p}:(\mathbf{p}-\mathbf{c})^2-R^2=0p:(p−c)2−R2=0
![![[Pasted image 20241213200501.png]]](https://i-blog.csdnimg.cn/direct/7a3c000c65484629ac6b4b35320164c9.png)
什么是交点?
交点p必须同时满足射线方程和球方程
求交点:
(o+td−c)2−R2=0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-R^2=0 (o+td−c)2−R2=0
at2+bt+c=0 at^2+bt+c=0 at2+bt+c=0
a=d⋅d a=\mathbf{d}\cdot\mathbf{d} a=d⋅d
b=2(o−c)⋅d b=2(\mathbf{o}-\mathbf{c})\cdot \mathbf{d} b=2(o−c)⋅d
c=(o−c)⋅(o−c)−R2 c=(\mathbf{o}-\mathbf{c})\cdot(\mathbf{o}-\mathbf{c})-R^2 c=(o−c)⋅(o−c)−R2
t=−b±b2−4ac2a t = \frac{-b\pm \sqrt{b^2-4ac}}{2a} t

最低0.47元/天 解锁文章
2374

被折叠的 条评论
为什么被折叠?



