计算机图形学笔记-光线跟踪
光学跟踪思路
- 计算由视点(相机)连接像素P(屏幕)中心的光线延长后所碰到得第一个物体的交点(求交)光线投射 Ray Casting
- 使用局部光照模型(如Phong)计算交点处颜色值
- 沿交点处的反射、折射方向对光线进行跟踪 (根据法向)
- 结束递归-
根据递归深度-在光线弹射到一定次数后停止3次左右
根据光线贡献-在光线贡献衰减到足够小的时候
光线跟踪特点
- 更容易表现处折射、反射、阴影的效果
- 更适用于复杂物体的表示(多边形网格或复合形体)
- 明暗效果仅仅由第一次相交的物体表面的法向方向、材质、视点和光照方向、以及光照强度等因素共同决定。
- 光线投射不考虑第二层以及更深的光线,因此不具有阴影、反射、折射效果。
- 镜面或透明才发生递归
光线跟踪求交算法
光线表示:
Pt=R0+tRd
R0是光源点,Rd光线朝向,t光线到达的位置,光线正方向上t为正。
平面表示:
显示表示:P0平面上一点,n平面法线
隐示表示:Hp=n.p+D=0点到平面距离
与三角形求交
- 计算光线与三角形所在平面的交
- 判断光线与平面的交点是否在三角形内部
添加纹理
以矩形表面为例
- 为矩形的四个顶点指定二维纹理坐标(建立对应关系-映射)
- 计算矩形内部与光线的相交的二维纹理坐标
- 使用该纹理坐标在纹理图上进行查找,根据查找结果赋予交点相应颜色(将纹理上的RGB值替换原本的漫反射系数)
光线跟踪的思考
Epsilon计算精度问题
加速算法(使用包围盒、层次结构加速)
光线跟踪加速
- 不足
光线跟踪算法时空复杂度高
大量时间消耗在可见性判断和求交测试 - 加速
层次包围体
均匀格点
八叉树、四叉树
空间二分树
包围体(长方体/球体)
把难以进行求交判定的物体,用容易进行求交判定的物体包围起来
if 与包围盒不相交,则一定不相交
if 与包围盒相交,再进行光线和物体相交检测
均匀格点
将场景分为均匀的网格,每个网格建立指针,索引,凡是在网格里面的物体,将其编号记录下来,存在列表里,当光线经过该网格DDA算法,增量算法,扫描转换算法,则与网格中物体求交。
八叉树(非均匀网格划分场景)
二叉树的二维推广(二叉树,平面网格四分)
- 八叉树建立
对整个场景先用立方体框住,将该立方体分为八个小立方体,如果某个小立方体物体数很多,就将该小立方体再分成八块,再往下,直到终止条件(到达某个设定的递归深度,或面片数数量) - 性质A
如果空间中存在一点P坐标为(x,y,z)将其转化为二进制(x=i1i2i3…in)(y=j1j2j3…jn),(z=k1k2k3…kn)则它所在的立方体的编码为
ql=1il+2jl+4kl, l=1,2,3,4…n - 性质B
P位于一编码为q1q2q1ffff…f中
则空间网格的前左下角坐标为
x=i1i2i3…ii0…0
y=j1j2j3…ji0…0
z=k1k2k3…ki0…0 - 过程
利用性质A求光线起点所在立方体编码Q,若起点位于立方体边界,判断光线是否射出场景,若射出,则结束。
Q空间线性八叉树的结点表查找结果
空间二叉树(游戏常用)BSP tree/Kd tree
空间一分为二,求光线从那边射入,射入那边再一分为二…依次
来源:CSDN
作者:llhong2547
链接:https://blog.csdn.net/llhong2547/article/details/104007697