光线追踪重投影方法

重投影这项技术一般用于时间性帧复用技术上,例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。光线追踪使用时间性帧复用技术一直觉得是个难题,比光栅渲染的要麻烦,所以提出一种光线追踪重投影方法,用来支撑光线追踪使用时间性帧复用技术。读这篇文章最好先对TAA这类技术的算法流程有了解


1.TAA抗锯齿技术简介

先简单介绍下TAA抗锯齿的原理,在游戏中,当前渲染一帧画面的单独拎出来看,是有锯齿的(物体边缘有狗牙),而TAA则将历史帧作为抗锯齿的参考数据(可以一帧也可以多帧)。为当前帧的一个像素找到它在历史帧中对应的那个像素,做个权重混合。如果用多个历史帧的话,那么越久远的帧在混合中使用的权重越低。

大致的原理图如下:

所以TAA技术的重点之一就是上图那根红色箭头,如何为当前像素找到它在上一帧中对应的位置。实现这个红色箭头的就是重投影技术。


2.重投影技术的简介

重投影技术,将当前像素进行投影,分为两种:

  • 反向重投影:从当前像素反向寻找其在历史帧中的位置。
  • 前向重投影:从历史像素前向寻找其在当前帧中的位置。

我认为区分清楚这两种方向不同的方法非常关键和重要。

TAA抗锯齿技术这类时间性复用技术,几乎只用于光栅渲染,很少在光线追踪中用到。并不是光线追踪渲染的图无锯齿,而是光线追踪渲染无法提供光栅渲染在重投影技术中所需要的数据,因此TAA技术无法或者很难直接从光栅渲染中套用在光线追踪渲染中。

重投影在光栅渲染中已有成熟的方法,但是在光线追踪中的相关研究较少,缺乏通用的方法。光栅渲染做重投影通常用的是反向重投影的方法。例如使用运动矢量(Motion Vecter)方法或者通过投影矩阵反推的方法。

但是运动矢量和投影矩阵方法都是用到光栅渲染过程中可以天然产生的数据,而光线追踪渲染的方法又大大不同,这些数据都没法在渲染过程中天然获得。

3. 光线追踪前向重投影方法

因为接触到查阅到的大多都是反向重投影的思路,所以我想了很久为光线追踪做重投影的路子,都觉得太绕太复杂。

后面读文献才知道还有前向重投影这个方向。我就想反过来从历史像素推出它大概会在当前帧跑到哪里行不行。答案是可以的,前向重投影的思路能够直接使用光线追踪过程中产生的数据。

先假设这个光线追踪场景:场景中物体都是静止不动的,前后帧只有摄影机是运动的,重投影只用到一帧历史帧。

原理图

具体方法流程:

  1. 该重投影方法需要缓存历史帧碰撞点坐标。

  2. 遍历历史像素时,首先取出像素对应的历史碰撞点坐标,利用当前摄像机参数将该坐标从世界坐标系变换到当前帧摄像机坐标系中。

  3. 然后利用相似三角形理论将该历史碰撞点的三维坐标变换为当前帧中的 UV 坐标,请看下图。

  4. 在摄像机坐标系中将摄像机与屏幕像素平面和历史光线碰撞点连接成相似三角形,再利用摄影机到像素平面的距离求该碰撞点在像素屏幕中的x 和y 坐标(即当前帧的UV坐标)。

  5. 接着将 UV 坐标转换为 NDC 标准设备坐标,再根据当前窗口尺寸计算得到光栅坐标。该光栅坐标即历史像素映射到目标帧中的像素坐标,若映射结果超出目标帧的像素范围则弃用;最后将历史像素颜色值存入重投影缓存中,用于与当前渲染帧像素做加权混合。

算法流程图:

效果
能够实现光线追踪的重投影算法,那TAA抗锯齿当然能做。我觉得有一块更适合用在光线追踪上的就是降噪,光线追踪采样数低的时候噪点非常严重,结果重投影技术去研究降噪技术,是一种省时间省性能的方法。

下图是我做的对光线追踪采样光线数量只有一条的时候,用了上面重投影技术做的时间性降噪方法,前后对比还是比较明显的。

因为并没有做额外帧的渲染,所以性能额外消耗很少。不过采样数只有1,也是尽力了,把采样次数提高一点的话,降噪效果也挺好,只是1的时候差异很明显。


4.讨论

上面的方法也是限定了场景的:场景中物体都是静止不动的,前后帧只有摄影机是运动的,重投影只用到一帧历史帧。

如果场景中物体会发生变换的话,我没有继续研究下去,不过我的想法是,现在方法是只有摄像机在运动,如果物体发生变换的话,那就是与摄像机发生相对运动。那就记录物体的变换矩阵,把历史帧物体的碰撞点坐标变换到当前帧的新三维坐标,再使用上面介绍的算法去计算历史像素其在当前帧中的目标像素点。

有其他光线追踪重投影想法的,或者我的算法有啥缺点改进的,都欢迎找我交流。

【光线追踪】光线追踪重投影方法(Ray Tracing Reprojection)相关推荐

  1. 带你从零开始徒手撸光线追踪代码(1)—— Ray Tracing in One Weekend

    前言   开坑一个新系列,由笔者带你不用api,只用最基本的C++语法写光线追踪,本系列可以看做是对<Ray Tracing in One Weekend>的翻译,当然原文虽然是英文,但有 ...

  2. GAMES101-现代计算机图形学入门-闫令琪 - lecture14 光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) - 课后笔记

    光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) 对AABB结构优化来加速光线追踪的速度 均匀网格(Uniform grids) 空间划分(Spatial part ...

  3. SLAM中线特征的参数化表示方法/重投影/初始化方法

    文章目录 1. 预备知识 齐次坐标 空间直线的优化 2. 空间直线的表示方法 2.1 空间直线的自由度 2.2 普吕克坐标 (Plucker Coordinates Representation) 直 ...

  4. Kalibr源码学习(一): 重投影误差

    Kalibr源码学习(一): 重投影误差 给自己挖一个大坑, 从标定结果来学习Kalibr的标定源码, 这里基本以KB模型为例, 也就是标定时, kalibr的模型设定为 --model pinhol ...

  5. GAMES101复习:光线追踪(Ray Tracing)

    目录 0. 阴影:Shadow Mapping(从光栅化角度实现) ⭐1.光线追踪:光路(线)的可逆性.光的折射.着色贡献度 1.0 Why Ray Tracing?光栅化的局限性 1.1 Recur ...

  6. 计算机图形学六:光线追踪-Ray Tracing

    文章目录 阴影映射(Shadow Mapping) Whitted-Style 光线追踪 原理 光线与物体求交 光线的表示方法 光线与隐式曲面求交 光线与显示曲面求交 如何加速 轴对齐包围盒(Axis ...

  7. 光线追踪(ray tracing)介绍与细节推导

    背景 最近因为找到关于光线追踪相关不错的教程,所以边学习边做记录并希望将相关资料进行分享. 光线追踪作为计算机图形学中一种可以获得良好的效果的渲染算法,有着非常广泛的应用.历史背景相关的介绍可参考百度 ...

  8. GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记

    光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...

  9. 《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》读后感以及光线追踪学习推荐...

    <Ray Tracing in One Weekend> 优点: 相对简单易懂 渲染效果相当好 代码简短,只看书上的代码就可以写出完整的程序,而且Github上的代码是将基类与之类写在一起 ...

最新文章

  1. 15 个 JavaScript Web UI 库 (转)
  2. Servlet第一个示例
  3. VC++6.0和VC++2010的区别
  4. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字
  5. 使用Docker容器的十大误区
  6. xml 文件解析 pull
  7. pat 乙级 1001 害死人不偿命的(3n+1)猜想(C++)
  8. $Android自定义控件在不同状态下的属性
  9. “这样使用RHEL合法吗”?
  10. 2021-06-14 阻塞队列的方法
  11. 计算机协会取消信息学奥赛,教育部2019年公示:信息学奥赛正式取消?
  12. 玩转电脑|电脑回收站还能这么玩,自定义图标让你的回收站与众不同
  13. unity实战:教你做黄豆君
  14. 阿里成立达摩院,三年投入超千亿
  15. 重磅!2021年国内有名的编程培训机构排名公布啦
  16. 用迭代器指针改变map容器的值
  17. 【C语言进阶】二、指针
  18. 微软的黑屏说明了什么?
  19. 狂神springboot
  20. 【Oracle】record varray (associative array 关联数组) table (nested table type 嵌套表类型)和%type、%rowtype的使用详解

热门文章

  1. 全新iPhoneSE发布,3299元/再见iPhone8/Plus
  2. linux如何查看python的版本_linux怎么改python默认版本
  3. SQL Compare教程:工作示例——比较和部署两个数据库(下)
  4. java基础巩固-宇宙第一AiYWM:为了维持生计,大数据Hadoop之HDFS分布式文件系统(HDFS读写流程、主从集群两种问题“单点故障”及“压力过大内存受限”、HDFS的架构设计)~整起
  5. SQL insert插入中存在属性值为空
  6. 通用电气运输系统加入区块链联盟
  7. docker容器使用
  8. pdb怎么调试python_如何在用pdb调试python时更改值?
  9. 关于IO口信号采集上下拉电阻的选择
  10. C#开发BIMFACE系列20 服务端API之获取模型数据5:批量获取构件属性