计算机图形学笔记-光线跟踪

不问归期 提交于 2020-01-17 22:05:42

计算机图形学笔记-光线跟踪

光学跟踪思路

  1. 计算由视点(相机)连接像素P(屏幕)中心的光线延长后所碰到得第一个物体的交点(求交)光线投射 Ray Casting
  2. 使用局部光照模型(如Phong)计算交点处颜色值
  3. 沿交点处的反射、折射方向对光线进行跟踪 (根据法向)
  4. 结束递归-
    根据递归深度-在光线弹射到一定次数后停止3次左右
    根据光线贡献-在光线贡献衰减到足够小的时候

光线跟踪特点

  1. 更容易表现处折射、反射、阴影的效果
  2. 更适用于复杂物体的表示(多边形网格或复合形体)
  3. 明暗效果仅仅由第一次相交的物体表面的法向方向、材质、视点和光照方向、以及光照强度等因素共同决定。
  4. 光线投射不考虑第二层以及更深的光线,因此不具有阴影、反射、折射效果。
  5. 镜面或透明才发生递归

光线跟踪求交算法

光线表示:
Pt=R0+tRd
R0是光源点,Rd光线朝向,t光线到达的位置,光线正方向上t为正。

平面表示:
显示表示:P0平面上一点,n平面法线
隐示表示:Hp=n.p+D=0点到平面距离

与三角形求交

  1. 计算光线与三角形所在平面的交
  2. 判断光线与平面的交点是否在三角形内部

添加纹理

以矩形表面为例

  1. 为矩形的四个顶点指定二维纹理坐标(建立对应关系-映射)
  2. 计算矩形内部与光线的相交的二维纹理坐标
  3. 使用该纹理坐标在纹理图上进行查找,根据查找结果赋予交点相应颜色(将纹理上的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

空间一分为二,求光线从那边射入,射入那边再一分为二…依次

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!