【GAMES202】Real-Time Ray Tracing 1—实时光线追踪1
一、前言
这篇我们开始新的话题—Real-Time Ray Tracing简称RTRT,也就是实时光线追踪,关于光线追踪,我们已经不止一次提到过它的优点,无论是软阴影还是全局光照,光线追踪都很容易做,唯一的缺点就是速度太慢了,所以如何把光线追踪做到实时人们进行了大量的研究。
二、Basic idea
1.sample per pixel
提到RTX显卡大家肯定都不陌生,那么RTX干了什么呢,它其实就是增加了一种硬件架构(RT core)能够让我们能够去进行光线追踪而已。 也就是说它属于人们在硬件上的突破。它每秒能追踪10G根光线,看起来虽然很多,但是实际上还要除以分辨率和帧数,并且在1s内还要留时间进行后处理,所以实际上并不多。最后的结果相当于每秒一个像素只用了一个样本的采样。另外我们还要提到一个概念,sample per pixel,以下简称spp,它代表一个光路的样本。
首先最基础的光路spp就需要四条光线构成,如上图所示,首先是primary ray和它的shadow ray,这构成了直接光照,其次就是secondary ray和它的shadow ray,这构成了一次反射的间接光照。当然后续还会有其它更多次反射的间接光照,但以上提到的4条光路是最基本的构成全局光照的光路,我们把这4个光路当成1个spp的样本。
这里可以看到primary ray的前面写了个rasterization,很容易想到,因为本来primary ray实现的效果和光栅化就是相同的,并且光栅化速度更快,这样我们1个spp就可以只用3条光线了。
2.Denoising
那么我们上面提到了1spp,现代的硬件已经允许我们去做1spp的路径追踪了,但是我们之前介绍过路径追踪,如果spp只有1的话,那么得出的结果是有严重的噪声的。所以RTRT的关键技术其实就是降噪。
如上图为spp=1的噪声极为严重的图和降噪后的对比图。
所以综上,我们的目标可以概况为去降噪一个1spp实现的有噪声的画面,不能过于模糊丢失细节,也不能出现渲染的错误,同时要保证降噪时间小于2ms。显然上图提到的已有方法都不可能实现这个目标。
三、Temporal accumulation / filtering
1.Motion vector
而事实上,RTRT降噪的关键就是Temporal。首先我们是假设画面变化是连续的而没有突变,帧和帧之间有一定的连续性,其次我们认为当前帧的前一帧是已经被滤波好了的,也就是一个递归的思想,这是Temporal filtering的一个基本思路。
并且我们引入一个新概念Motion vector,它的作用就是去对应上一帧和当前帧任意一个点的对应位置,也就是它可以告诉我们物体在画面上是怎么运动的。简单地说就是可以知道世界空间下相同物体在不同帧的时候在屏幕上的不同位置。这样也就有一个好处,我们上面说过我们假设画面是连续的,那么Shading一定程度自然也是连续的,也就是说上一帧已经滤波好了的画面可以拿到当前帧复用,并且由于我们的Motion vector已经帮我们对应了同一个物体的在两帧上的不同位置,所以我们很容易知道当前帧的某个像素的颜色应该参考上一帧的哪一个像素。而这也就是时间上的复用的思路,它间接的增加了spp,并且不是简单的从1增加到2,因为我们前面提到它是一个递归,用来降噪的上一帧一定程度上来源于上上帧,所以每一帧对下面所有帧的贡献是一个指数衰减。
2.G-Buffer
这里我们再引入一个叫做G-Buffer的概念,中文就是几何缓冲区,熟悉延迟渲染的朋友对它一定不会陌生。简单地说其实就是在渲染一幅图的过程中,得到的屏幕空间上储存的一系列信息,如深度图,法线图,世界坐标,基础色(kd)等等。也就是我们渲染的过程中可以免费得到的一些信息,也就是生成储存它们不需要太大的开销。当然,由于它是屏幕空间上的信息自然也会有一些问题。
3.Back Projection
我们前面说的过程中最关键的操作就是找对应,也就是第 i 帧和第 i-1 帧相同世界坐标物体对应的不同像素。也就是当前帧的像素它在上一帧的哪呢?
这里我们设当前帧的屏幕坐标为x,世界坐标为s,那么如果我们有G-Buffer的话我们是可以直接得到x的世界坐标的,当然,没有G-Buffer也没关系,我们知道顶点是通过MVP+视口变换到屏幕坐标的,那么我们知道屏幕坐标x,只需要逆变换就可以了(这里上图写了MVPE四个逆变换,个人觉得大概是闫令琪老师写错了,如果只是回到世界坐标是不需要乘以M矩阵的逆的),同时如果顶点在世界空间移动也没有关系,我们是知道它的变换的,假设它的变换是T矩阵,那么上一帧的世界空间位置s'自然就是s去乘以T的逆,当然如果没有移动那么s=s'。我们如果知道了上一帧的世界空间的位置s',自然就可以通过MVP+视口变换得到上一帧的屏幕空间位置x'(同样的上图最后一行应该是E'P'V',闫令琪老师少写了个E'多写了个M'),这样对应的像素就找到了。
4.Temporal Accum./Denoising
那么找到了对应,如何把两帧结合呢?最简单的操作,把两帧做一个线性的blending。我们设~为没有滤波的有噪声的内容,- 代表滤波后降噪后的内容。如上图所示代表我们先对当前帧做一个空间上的滤波,当然我们并不能只依赖于这个Filter,因为我们提过1spp的图像的噪声无论怎么做这个滤波都是无法恢复的。接下来我们用上一帧已经滤波好了的和当前简单滤波过的帧做一个线性blending— ,通常α被取0.1~0.2,也就是上一帧占的贡献通常在80%~90%。
可以看到1spp再降噪和光线追踪了足够长时间的效果已经非常非常接近了,唯一的瑕疵可能就是在一些AO的地方,因为降噪滤波会导致AO缺失,但是总体来看,效果已经非常不错了。
四、Failure cases
1.switching scenes
说了这么多时间上的复用,我们接着说它会出现问题的情况,首先第一种情况,画面的突变,比如,镜头的切换,场景光照的突然改变,画面的切换,这种两帧之间没有连续性的情况自然会导致时间上的复用出现问题,通常这种情况下要经过一个burn-in period才会恢复正常,也就是一个预热的时间,我们之前时间上累加的复用效果才会逐渐消失。
2.walking backwards in a hallway
第二种情况是倒退着走,如上图的走廊的例子,在以图中视角倒退的时候我们会发现,屏幕上会不断出现上一帧没有的新的信息,而由于是新的信息,我们找不到对应,也就没法进行复用了,我们把这个归结为屏幕空间的问题,因为屏幕空间的信息有限。
3.suddenly appearing background (disocclusion)
第三种情况,也就是突然出现的背景,如上图所示,因为某些物体的运动导致原本被这些物体遮挡的东西在第二帧暴露了出来,但是第一帧里并没有相关的信息,在找对应的时候由于是在图像空间上,所以查询到对应的信息是错误的,这种问题实质上也是屏幕空间的缺陷造成的。
而如果这时我们强行用上一帧的信息,就会产生拖尾,残影的效果。
4.Adjustments to Temp. Failure
那么如何避免上面提到的那些问题呢?出现的问题本身是由于无脑使用上一帧的信息导致的,我们只需要有取舍的使用上一帧信息即可。
Clamping
第一种方法自然是调整α的值,使得当前帧的贡献更大一些,当然噪声自然就会增加。
Detection
另一种方法则是我们进行检测,上一帧的信息到底可不可用。工业界上的一种办法,我们会用一个叫Object ID的东西对不同物体标号,我们会渲染一幅图,不同的物体有不同的颜色,这时候假设我们Motion vector找对应物体的ID不同,我们就不去采用上一帧的信息。而如果检测不能用,我们就需要调整blending中α的值了,让本帧的贡献更高一些,当然,噪声也会更多,我们当然可以对本帧的空间滤波增强,不过换来的自然是更模糊的图像,这依然是一种取舍。
5.More Temporal Failure
事实上,时间复用还有更多问题,这里再简单介绍两种,事实上我们前面提到的都是几何上出现的问题,但是其实在着色上也会出现问题。如上图所示,假如场景中的Camera和柱子以及平面都不动,而我们只移动光源的情况下,我们的Motion vector永远都是0,那么它就会永远复用上一帧的信息,这样就会导致阴影的拖尾现象,工业界人们常常叫做detached shadows。
再有就是Glossy反射的问题,如图中的椅子,假设平面不动,那么由于motion vector为0,平面的着色会永远复用上一帧,这样当我们移动影子的时候,平面上的反射效果也会有拖尾,或者说滞后,延迟的效果,反射效果的变化永远慢于实际椅子的变化。
以上两种情况都是Shading的变化造成的问题,这种问题传统的Motion vector并不能解决。
五、Some Side Notes
本篇Temporal方法和TAA也就是时间上的抗锯齿非常相似,它们本质上都是复用上一帧的信息提高一个像素内的采样数。一切利用Temporal的方法如DLSS都是相似的。简单地说,尽管temporal有诸多问题,但是相对来说还是比较好用的。
参考
GAMES202_Lecture_12 (ucsb.edu)
Lecture 12 Real-Time Ray-Tracing 1_哔哩哔哩_bilibili
相关文章:
【GAMES202】Real-Time Ray Tracing 1—实时光线追踪1
一、前言 这篇我们开始新的话题—Real-Time Ray Tracing简称RTRT,也就是实时光线追踪,关于光线追踪,我们已经不止一次提到过它的优点,无论是软阴影还是全局光照,光线追踪都很容易做,唯一的缺点就是速度太慢…...
Linux修复损坏的文件系统
如何判断文件系统是否损坏 当文件系统受损时,将会出现一些明显的迹象。例如,文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外,系统也可能发出一些错误信息,如"Input/output error"、"Filesyst…...
三分钟学会一个新技能——使用Java操作Redis
目录 1、前置准备操作 1.1、为什么要进行前置准备操作 1.2、本地如何访问到云服务上Redis的6379端口号 1.3、配置步骤: 2、配置后本地主机如何操作 3、常用命令举例 3.1、通用命令举例 3.2、string相关命令举例 3.3、hash相关命令举例 3.4、list相关命令…...
Java学习笔记------内部类
内部类的定义: 在一个类的里面再定义一个类 内部类的使用场景: 内部类表示的事物是外部类的一部分(B类表示的事物是A类的一部分,且B单独存在没有意义)内部类单独出现没有任何意义 内部类的访问特点 内部类可以直接…...
面试题:问js的forEach和map的区别
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 【国庆头像】- 国庆爱国 程序员头像!总有一款适合你! 前言 为什么要写这么一篇文章,原因是今天下午水群的时候&…...
Hadoop设置固定ip无效的解决办法
今天配置Hadoop的时候,执行vi /etc/sysconfig/network-scripts/ifcfg-ens33修改网络配置文件后,一切正常,但重启后IP改变了,并且在修改以及重启网络连接数次后,IP依旧不按照我在ifcfg-ens33中配置的那样,检…...
论文解读 | 用于3D对象检测的PV-RCNN网络原创
原创 | 文 BFT机器人 01 背景 本文的背景涉及到3D物体检测,这是一个在自动驾驶和机器人等领域应用广泛的重要问题。在这些领域,LiDAR传感器被广泛用于捕捉3D场景信息,生成不规则且稀疏的点云数据。这些点云数据提供了理解和感知3D场景的关键…...
kali安装volatility及插件mimikatz
1.准备工作 kali安装pip2 wget https://bootstrap.pypa.io/pip/2.7/get-pip.py python2 get-pip.py 查看pip2版本 python2 -m pip -v pip2安装升级 pip2 install --upgrade setuptools 安装2个库 pip2 install construct2.10.54 pip2 install pycryptodome 下载文件d…...
什么是阻塞队列?如何使⽤阻塞队列来实现⽣产者-消费者模型?哪个阻塞队列最常用?
阻塞队列 阻塞队列(Blocking Queue)是一种特殊类型的队列,它具有阻塞特性,即当队列为空时,试图从队列中取出元素的操作会被阻塞,直到队列中有元素可取。同样,当队列已满时,试图将元素放入队列的操作也会被阻塞,直到队列有空闲空间。 JDK 7引入了7个阻塞队列,它们都…...
Bean拷贝组件(注解驱动)方案设计与落地
一、背景 数据流转在各层之间的过程,应当是改头换面的,字段属性数量,属性名称(一般不变,但也有重构时出现变化的情况),类型名称(普遍变化例如BO、VO、DTO)。对于转换的业…...
hive的建表语句
hive建表语句CREATE TABLE ccwn_zh_event_push (customerid string,cardnumber string,accountnumber string,eventcode string,eventtime string,activities string,activityRefuseCode string,lables string)PARTITIONED BY(dt string)ROW FORMAT SERDE org.apache.hadoop.hi…...
提升效率:PostgreSQL准确且快速的数据对比方法
作为一款强大而广受欢迎的开源关系型数据库管理系统,PostgreSQL 在数据库领域拥有显著的市场份额。其出色的可扩展性、稳定性使其成为众多企业和项目的首选数据库。而在很多场景下(开发|生产环境同步、备份恢复验证、数据迁移、数据合并等)&a…...
【轻NAS】Windows搭建可道云私有云盘,并内网穿透公网访问
文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 云存储作为近些年兴起的概念,成功吸引了各大互联网厂商下场&…...
计算机网络 第一章:概述
目录 一.因特网概述 1.1网络、互联网(互连网)和因特网 1.2internet与Internet的区别 1.3因特网服务提供者ISP(Internet Service Provider) 1.4因特网组成 二.三种交换方式 2.1电路交换 2.2分组交换(重点) 2.3报文交换 三.计算机网络的定义和分类 四.计算机网络的性能…...
centos7 firewalld ip转发设置、安装docker-compose出现错误、docker-compose部署Yapi
一 centos7 firewalld ip转发设置 #!/bin/bash #开启系统路由模式功能 vim /etc/sysctl.conf #添加下面一行 net.ipv4.ip_forward1 #运行这个命令会输出上面添加的那一行信息,意思是使内核修改生效 sysctl -p #开启firewalld systemctl start firewalld #防火墙开启…...
Cglib代理和JDK代理原理的区别
一、JDK Jdk动态代理,拿到目标类所继承的接口,生成代理类,并且代理类也会实现和目标类一样的接口。 二、Cglib Cglib代理功能更强,无论目标类是否实现接口都可以代理,他是基于继承的方式类代理目标类,如果…...
论文阅读-A General Language for Modeling Social Media Account Behavior
论文链接:https://arxiv.org/pdf/2211.00639v1.pdf 目录 摘要 1 Introduction 2 Related work 2.1 Automation 2.2 Coordination 3 Behavioral Language for Online Classification 3.1 BLOC alphabets 3.1.1 Action alphabet 3.1.2 Content alphabets 3.…...
Python中的异常处理4-3
在《Python中的异常处理4-2》中提到,except语句后面可以加上具体的异常类型。有时我们需要这个异常的其他细节,此时可以使用except...as语句。 1 except...as语句 except..as语句的格式为 except 异常类型 as 异常实例名 从以上格式中可以看到&#…...
Swift学习内容精选(一)
Swift 可选(Optionals)类型 Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。 Swfit语言定义后缀?作为命名类型Optional的简写&…...
Marin说PCB之封装设计系列---(02)--异形焊盘的封装设计总结
每天下班回家看电视本来是一件很美好的事情,可是正当我磕着瓜子看着异人之下的时候,手机突然响起来了,我以为是我们组哪个同事找我呢。一接电话居然是我的老朋友陈世美陈总,江湖人称少妇杀手。给我打电话主要是说他最近遇到一个异…...
SpringBoot使用AOP详解
目录 1 AOP是什么2 AOP概念3 Springboot中使用AOP4 AOP原理5 应用场景 1 AOP是什么 AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&…...
【Qt】QGroundControl入门1:介绍
1、简介 1.1 QGroundControl QGroundControl是一款开源的无人机地面控制站软件,依赖Qt库,简称QGC。 QGroundControl为任何支持 MAVLink协议 的无人机提供完整的飞行控制和任务规划。QGroundControl为 PX4 和 ArduPilot 驱动的无人机提供驱动配置。 源码:https://github.co…...
第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
198.打家劫舍,213.打家劫舍II,337.打家劫舍III
代码随想录训练营第48天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III 198.打家劫舍文章思路代码 213.打家劫舍III文章思路代码 337.打家劫舍III文章思路代码 总结 198.打家劫舍 文章 代码随想录|0198.打家劫舍 思路 d p [ i ] M a x ( d p [ i − …...
msvcp140.dll是什么东西,如何解决msvcp140.dll丢失的问题的方法分享
在现代生活中,电脑已经成为我们工作、学习和娱乐的重要工具。然而,电脑问题的出现往往会给我们的生活带来不便。其中,"msvcp140.dll丢失"是一个常见的电脑问题。本文将详细介绍这个问题的原因和解决方法,帮助大家更好地…...
音视频 SDL vs2017配置
一、首先我把SDL放在了C盘根目录下 二、新建空项目 三、添加main.cpp //main.cpp #include<iostream> #include <SDL.h>int main(int argc, char* argv[]) // main函数头必须这样写,因为SDL把main定义成了宏 {SDL_Delay(3000); // 让窗口在屏幕上保持…...
前端面试要点
0914 JScript深拷贝和浅拷贝(js解构赋值算哪个?) 深拷贝和浅拷贝 回流和重绘 回流和重绘 webpack打包流程 Webpack打包 虚拟DOM 虚拟DOM git合并分支 git合并分支 CSS盒子模型 CSS盒子模型 0911 WebPack分包 webpack分包 ts泛型 ts泛型 优化…...
shell字符串处理之字符串比较
引言 我们在使用shell编写脚本时,经常需要对字符串进行处理,如字符串大小比较、模式匹配、替换、截断等。本文将梳理字符串比较中常见的用法。 字符串比较 1. 直接比较字符串 a$1 b$2 c"" # 等于 if [ $a "abc" ];thenecho $a …...
怎么获取别人店铺的商品呢?
jd.item_search_shop(获得店铺的所有商品) 为了进行电商平台 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个JD应用注册一个应用程序键(App Key) 。 3)下载JDAPI的SDK并掌握基本的API…...
【数据结构】二叉树的链式结构
【数据结构】二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType; // 二叉树的结构 typedef struct BinaryTreeNode {BTDataType data; // 树的值struct BinaryTreeNode *left; // 左孩子struct BinaryTreeNode *right;// 右孩子 } BinaryTreeNode;二…...
浪潮云网站建设/什么是指数基金
3043: 取个标题好难 Time Limit(Common/Java):6000MS/18000MS Memory Limit:65536KByteTotal Submit: 17 Accepted:4 Description 你是否经常在写完文章之后为文章取一个合适的标题而苦恼?这里提供一个很有趣的方法。首先,标题应该概括文…...
清河网站建设设计费用/泉州关键词排名工具
MySQL 5.5 版本,编译安装使用 cmake 。cmake 安装之前,如果已经运行过 cmake,尝试运行下面的命令来避免冲突,# make clean# find / -iname "cmakecache.txt" | rm 编译安装的时候,需要指定 DDEFAULT_CHARET…...
wordpress的index.php/淘宝指数官网入口
很久木有来写博文啦,发现学校的教务系统很多童鞋都木有修改初始密码,于是博主就想写试用python写一个爬虫小脚本,将木有修改初始密码的童鞋资料扒下来,然后嘿嘿嘿~~~通知他们修改!鉴于写博文时未通知这些受害童鞋们&am…...
手机设计菜单制作软件/网页优化方法
18功能:通过函数的递归调用计算阶乘。【1】 power(n-1)*n 【2】 &n 【3】 power(n) 19功能:数组名作为函数参数,求平均成绩。【1】 a 【2】 av 【3】 &sco[i] 【4】 sco20功能:计算个人与各科平均成绩及全班平均成绩&…...
制造业网站建设/济南做网站建设的公司
背景 在使用github推送文件到仓库时,使用了本地代理,容易出现此问题,控制台返回以下错误信息: fatal: unable to access https://...: OpenSSL SSL_read: Connection was reset, errno 10054 解决方法: 方法1:自己…...
哪个网站可以做练习题/企业seo顾问服务
ajax.net强化了的组件支持1 //ajax.net对js的三大扩展:组件component,控件control,行为behavior 2 //1.Sys.Component基类 3 //Sys.Component基类的常用属性 4 //属性 描述 5 /…...