实现光线追踪重投影的方法
光线追踪重投影方法
重投影这项技术一般用于时间性帧复用技术上,例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。读这篇文章最好先对TAA这类技术的算法流程有了解。
1.TAA抗锯齿技术简介
先简单介绍下TAA抗锯齿的原理,在游戏中,当前渲染一帧画面的单独拎出来看,是有锯齿的(物体边缘有狗牙),而TAA则将历史帧作为抗锯齿的参考数据(可以一帧也可以多帧)。为当前帧的一个像素找到它在历史帧中对应的那个像素,做个权重混合。如果用多个历史帧的话,那么越久远的帧在混合中使用的权重越低。
大致的原理图如下:
所以TAA技术的重点之一就是上图那根红色箭头,如何为当前像素找到它在上一帧中对应的位置。实现这个红色箭头的就是重投影技术。
2.重投影技术的简介
重投影技术,将当前像素进行投影,分为两种:
- 反向重投影:从当前像素反向寻找其在历史帧中的位置。
- 前向重投影:从历史像素前向寻找其在当前帧中的位置。
我认为区分清楚这两种方向不同的方法非常关键和重要。
TAA抗锯齿技术这类时间性复用技术,几乎只用于光栅渲染,很少在光线追踪中用到。并不是光线追踪渲染的图无锯齿,而是光线追踪渲染无法提供光栅渲染在重投影技术中所需要的数据,因此TAA技术无法或者很难直接从光栅渲染中套用在光线追踪渲染中。
重投影在光栅渲染中已有成熟的方法,但是在光线追踪中的相关研究较少,缺乏通用的方法。光栅渲染做重投影通常用的是反向重投影的方法。例如使用运动矢量(Motion Vecter)方法或者通过投影矩阵反推的方法。
但是运动矢量和投影矩阵方法都是用到光栅渲染过程中可以天然产生的数据,而光线追踪渲染的方法又大大不同,这些数据都没法在渲染过程中天然获得。
3. 光线追踪前向重投影方法
因为接触到查阅到的大多都是反向重投影的思路,所以我想了很久为光线追踪做重投影的路子,都觉得太绕太复杂。
后面读文献才知道还有前向重投影这个方向。我就想反过来从历史像素推出它大概会在当前帧跑到哪里行不行。答案是可以的,前向重投影的思路能够直接使用光线追踪过程中产生的数据。
先假设这个光线追踪场景:场景中物体都是静止不动的,前后帧只有摄影机是运动的,重投影只用到一帧历史帧。
原理图:
具体方法流程:
-
该重投影方法需要缓存历史帧碰撞点坐标。
-
遍历历史像素时,首先取出像素对应的历史碰撞点坐标,利用当前摄像机参数将该坐标从世界坐标系变换到当前帧的摄像机坐标系中。
-
然后利用相似三角形理论将该历史碰撞点的三维坐标变换为当前帧中的 UV 坐标,请看下图。
-
在摄像机坐标系中将摄像机与屏幕像素平面和历史光线碰撞点连接成相似三角形,再利用摄影机到像素平面的距离求该碰撞点在像素屏幕中的x 和y 坐标(即当前帧的UV坐标)。
-
接着将 UV 坐标转换为 NDC 标准设备坐标,再根据当前窗口尺寸计算得到光栅坐标。该光栅坐标即历史像素映射到目标帧中的像素坐标,若映射结果超出目标帧的像素范围则弃用;最后将历史像素颜色值存入重投影缓存中,用于与当前渲染帧像素做加权混合。
算法流程图:
效果:
能够实现光线追踪的重投影算法,那TAA抗锯齿当然能做。我觉得有一块更适合用在光线追踪上的就是降噪,光线追踪采样数低的时候噪点非常严重,结果重投影技术去研究降噪技术,是一种省时间省性能的方法。
下图是我做的对光线追踪采样光线数量只有一条的时候,用了上面重投影技术做的时间性降噪方法,前后对比还是比较明显的。
因为并没有做额外帧的渲染,所以性能额外消耗很少。不过采样数只有1,也是尽力了,把采样次数提高一点的话,降噪效果也挺好,只是1的时候差异很明显。
4.讨论
上面的方法也是限定了场景的:场景中物体都是静止不动的,前后帧只有摄影机是运动的,重投影只用到一帧历史帧。
如果场景中物体会发生变换的话,我没有继续研究下去,不过我的想法是,现在方法是只有摄像机在运动,如果物体发生变换的话,那就是与摄像机发生相对运动。那就记录物体的变换矩阵,把历史帧物体的碰撞点坐标变换到当前帧的新三维坐标,再使用上面介绍的算法去计算历史像素其在当前帧中的目标像素点。
有其他光线追踪重投影想法的,或者我的算法有啥缺点改进的,都欢迎找我交流。
相关文章:

实现光线追踪重投影的方法
光线追踪重投影方法 重投影这项技术一般用于时间性帧复用技术上,例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。读这篇文章最好先对TAA这类技术的算法流程有了解。 1.TAA抗锯齿技术简介 先简单介绍下TAA抗锯齿的原理,在游戏中,当前…...
Hyperbolic Representation Learning for CV
Contents Hyperbolic geometry[CVPR 2020] Hyperbolic visual embedding learning for zero-shot recognitionIntroductionApproachHyperbolic Label Embedding LearningHyperbolic Image Embedding LearningExperiment[CVPR 2020] Hyperbolic Image EmbeddingsIntroduction...

In Context Learning 相关分享
个人知乎详见 https://zhuanlan.zhihu.com/p/603650082/edit 1. 前言 随着大模型(GPT3,Instruction GPT,ChatGPT)的横空出世,如何更高效地提示大模型也成了学术界与工业界的关注,因此In-context learning…...

【前端笔试题一】:解析url路径中的query参数
前言 本文记录下在笔试过程中的前端笔试编程题目,会持续更新 1. 题目: 解析 url 路径中的 query 参数,比如:‘http://building/#/skeleton?serialNumber2023020818332821073&jobNo210347&target%7B%22a%22%3A%22b%22%2C…...

K_A12_001 基于STM32等单片机采集火光火焰传感参数串口与OLED0.96双显示
K_A12_001 基于STM32等单片机采集火光火焰传感参数串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC火光火焰模块1.2、STM32F103C8T6火光火焰模块五、基础知识学习与相…...

Java基础42 枚举与注解
枚举与注解一、枚举(enumeration)1.1 自定义类实现枚举1.2 enum关键字实现枚举1.2.1 enum的注意事项1.2.2 enum的使用练习1.2.3 enum的常用方法1.2.4 enum的使用细节及注意事项1.2.5 enum练习二、注解(Annotation)2.1 Override&am…...

shell的变量和引用
文章目录二、变量和引用2.1 什么是变量2.2变量的命名2.3 变量的类型2.3.1 根据数据类型分类2.3.2 根据作用域分类2.4 变量的定义2.5 shell中的引用2.6 变量的运算练习:二、变量和引用 在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shel…...

基于PHP的招聘网站
摘要在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括在线招聘的网络应用,在外国在线招聘已经是很普遍的方式,不过国内的在线招聘可能还处于起步阶段。招聘网站具有招聘信息功能的双向选择,…...

轻松使用 Python 检测和识别车牌(附代码)
车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理,检测和识别车牌,最后显示车牌字符,作为…...

DVWA—CSRF-Medium跨站请求伪造中级
注意: 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成 Medium 一、这一关同样我们需要埋下伏笔,诱使用户点击来提交,首先从XSS(Stored)入手。 注意:在前面介绍…...

【电商】后台订单生成
结合商品流转的电商系列介绍了一些了,商品已经采购入库、价格税率设置好了、活动及相关模板也已经准备完毕,下面就应该上架销售了,现在接着聊下订单的生成。 订单从产生到最终的关闭需要经历很多的环节,订单也是电商系统的核心数据…...

作为公司,这个5款在线软件工具赶紧安利起来!
2023年了 ,您的企业还没使用在线软件工具吗?自从用了在线工具之后,感觉打开了新办公世界的大门,效率蹭蹭蹭地往上涨啊。对于喜欢追求效率和便捷的我来说,在线实在是太棒了!今天安利几个非常不错的在线软件工…...

面试(七)为什么一般希望将析构函数定义为虚函数
class B { public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;} };class D : public B { public:~D(){cout << "D::~D()" << endl;} };void Test(B* t) {delete t;t nullptr; }int main() {B *pb new B;Test…...
MySQL必会四大函数-时间函数
一、时间日期获取函数 获取当前日期(date)函数:curdate() mysql> select curdate(); 2023-02-09 获取当前时间(time)函数:curtime() select curtime(); 08:49:27 获取当前时间戳(date &…...

震惊!邻桌的程序猿做可视化报告竟然比我还快,带着好奇心我打开了他的电脑,发现惊天秘密,原因竟是...
其实,本文就是想分享一个做可视化的捷径! 制作可视化的方式有千千万。 Excel 控若能轻车熟路驾驭 VBA,能玩出各种花来,再不济借助图表插件外援也能秒杀一众小白选 手。 会编程的,Echarts 几十行代码,分分…...
mathtype7与word冲突,无法安装,不显示工具栏的问题解决
首先无法安装,或安装出错时,要清理注册表防止以后再次出现该问题,以此记录留作备份。打开注册表的方法是键盘winr键同时按(win就是Alt旁边像窗户图标的键),正常的话会跳出一个叫“运行”的家伙,…...

IBM AIX 升级Openssh 实现篇(编译安装)
升级成功佐证 !!!本文所有内容仅作参考,请在测试环境中具体测试完毕后才能应用于生产环境!!! [1]备份和恢复方案 开启telnet 服务,防止ssh 掉线后无法重连维护。在修复漏洞后关闭telnet。 备份该服务相关的所有文件,以便恢复。 root@TEST:/etc# vi inetd.conf #ftp…...

linux的睡眠框架及实现
睡眠 4 种模式:S2I (Suspend-to-Idle): 挂起系统,IO进入低功耗模式。需配置CONFIG_SUSPEND。Standby:执行S2I后,把AP (nonboot CPU) 离线。除了CONFIG_SUSPEND的支持外,还需要向suspend子系统注册ÿ…...

Java面试知识点
工作也有好些年了,从刚毕业到前几年看过无数的面试题,总想着自己写一个面试总结,随着自我认识的变化,一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也总结过,但是答案不尽相同,如…...
PTA Advanced 1159 Structure of a Binary Tree C++
目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, a binary tree can be un…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...