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

news2024/11/27 8:38:20

光线追踪重投影方法

重投影这项技术一般用于时间性帧复用技术上,例如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.讨论

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决ThinkPHP5.1出现MISS缓存未命中问题

一淘模板(56admin.com)给大家带来了关于ThinkPHP5.1的相关知识,其中主要介绍了CDN是什么?为什么使用它?怎么解决ThinkPHP5.1 MISS缓存未命中问题?感兴趣的朋友下面一起来看一下吧,希望对大家有帮…

疑难杂症篇(二十一)--Ubuntu18.04安装usb-cam过程出现的问题

对Ubuntu18.04{\rm Ubuntu 18.04}Ubuntu18.04环境下的ROS{\rm ROS}ROS的melodic{\rm melodic}melodic版本安装usb−cam{\rm usb-cam}usb−cam过程出现的两个常见问题提出解决方案。 1.问题1:usb-cam功能包编译时出现"未定义的引用"的问题 问题描述&#…

@RefreshScope 加在 Quartz 触发器类导致异常问题分析

背景 承接上篇,测试过程中又遇到了 Nacos Config 的动态刷新注解 RefreshScope 与 Quartz 框架结合的问题,Bug 排查路上,顺手记录一下吧。 问题 有个模块使用了Quartz ,通过配置控制任务调度的周期和分组名称。 因为引用了动态…

如何解决thinkphp验证码不能显示问题?

thinkPHP做验证码这一块,可以使用自带的验证码扩展,具体步骤如下: 一、安装扩展 composer require topthink/think-captcha 二、模版中使用 将原来静态页面的验证码图片替换为{:captcha_img()},这个会自动生成验证码图片。 <div>{:captcha_img()}</div> 或者 &…

如何理解 K8s 动态伸缩与触发上线?

K8s 版本&#xff1a;1.23.6 目录一、动态伸缩二、触发上线一般地&#xff0c;如果仅修改 Pod 的副本数&#xff08;如新增/缩减&#xff09;&#xff0c;这就属于动态伸缩。如果是修改容器镜像的版本&#xff0c;则会触发上线&#xff0c;具体看下面例子。 一、动态伸缩 1、…

00后整顿职场?公司测试岗却新来了个00后卷王,3个月薪资干到20K...

最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师&#xff0c;面试官都会问一句“会编程吗&#xff1f;有没有自动化测试…

Mybatis框架(全部基础知识)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

2023年了,来试试前端格式化工具

在大前端时代&#xff0c;前端的各种工具链穷出不断&#xff0c;有eslint, prettier, husky, commitlint 等, 东西太多有的时候也是trouble&#x1f602;&#x1f602;&#x1f602;,怎么正确的使用这个是每一个前端开发者都需要掌握的内容&#xff0c;请上车&#x1f697;&…

DHCP Relay中继实验

DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配&#xff0c;而PC要求分配固定的地址&#xff0c;网段信息已经在图中进行标明。 设备配置 AR1&#xff1a; AR1作为DHCP Server基本配置跟DHCP Server没区别&#xff0c;不过要加一条静态路由&#xff…

基础篇:02-SpringCloud概述

1.SpringCloud诞生 基于前面章节&#xff0c;我们深知微服务已成为当前开发的主流技术栈&#xff0c;但是如dubbo、zookeeper、nacos、rocketmq、rabbitmq、springboot、redis、es这般众多技术都只解决了一个或一类问题&#xff0c;微服务并没有一个统一的解决方案。开发人员或…

计算机组成原理(三)

5.掌握定点数的表示和应用&#xff08;主要是无符号数和有符号数的表示、机器数的定点表示、数的机器码表示&#xff09;&#xff1b; 定点数&#xff1a;小数点位置固定不变。   定点小数&#xff1a;小数点固定在数值位与符号位之间&#xff1b;   定点整数&#xff1a;小…

R语言贝叶斯方法在生态环境领域中的高阶技术

贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于频率思想的统计学即频率学派完全不同的统计学方法&#xff0c;它在统计建模中具有灵活性和先进性特点&#xff0c;使其可以轻松应对复杂数据和模型结构。然而&#xff0c;很多初学者在面对思想、技术和方法都与传统统计学有着…

Springcloud----Nacos快速搭建使用

Nacos使用指南 Nacos完整的搭建和项目配置流程&#xff0c;上手简单 一、Nacos安装启动 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主…

尚硅谷的尚融宝项目

先建立一个Maven springboot项目 进来先把src删掉&#xff0c;因为是一个父项目&#xff0c;我们删掉src之后&#xff0c;pom里配置的东西&#xff0c;也能给别的模块使用。 改一下springboot的版本号码 加入依赖和依赖管理&#xff1a; <properties><java.versi…

大型智慧校园系统源码 智慧校园源码 Android电子班牌源码

一款针对中小学研发的智慧校园系统源码&#xff0c;智慧学校源码带电子班牌、人脸识别系统。系统有演示&#xff0c;可正常上线运营正版授权。 私信了解更多&#xff01; 技术架构&#xff1a; 后端&#xff1a;Java 框架&#xff1a;springboot 前端页面&#xff1a;vue e…

keepalived+mysql高可用

一.设置mysql同步信息两节点安装msyql略#配置节点11.配置权限允许远程访问mysql -u root -p grant all on *.* to root% identified by Root1212# with grant option; flush privileges;2.修改my.cnf#作为主节点配置(节点1)#作为主节点配置 server-id 1 …

leetcode刷题 | 关于前缀和题型总结1

leetcode刷题 | 关于前缀和题型总结1 文章目录leetcode刷题 | 关于前缀和题型总结1题目链接和为K的子数组连续数组/0 和 1 个数相同的子数组和大于等于 target 的最短子数组/长度最小的子数组路经总和Ⅲ题目链接 560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09;…

Python-第三天 Python判断语句

Python-第三天 Python判断语句一、 布尔类型和比较运算符1.布尔类型2.比较运算符二、if语句的基本格式1.if 判断语句语法2.案例三、 if else 语句1.语法2.案例四 if elif else语句1.语法五、判断语句的嵌套1.语法六、实战案例一、 布尔类型和比较运算符 1.布尔类型 布尔&…

【学习笔记】Nginx实战

反向代理实战 解压Tomcat两次-Tomcat8081、Tomcat8082两个文件夹Tomcat8081只需要修改http协议端口8081Tomcat8082&#xff1a;&#xff08;三个都需要改&#xff0c;不然只会启动其中一个&#xff09;1.修改server的默认端口2.修改http协议的默认端口3.膝盖默认ajp协议的默认端…

面试题: Redis的数据备份

1 RDBRDB全称为Redis Database Backup file &#xff0c;也被叫做Redis数据快照&#xff0c;简单来说就是将当前的所有数据都记录打哦磁盘中&#xff0c;当redis故障重启时&#xff0c;从磁盘读取快照文件进行数据恢复。连接客户端后&#xff0c;使用save命令进保存&#xff0c…