首页 > 其他分享 >Real-Time Ray Tracing 1

Real-Time Ray Tracing 1

时间:2022-09-19 17:00:12浏览次数:65  
标签:Real 一帧 光线 Tracing 物体 滤波 像素 motion Ray

实时光线追踪和实时全局光照都是光线弹射两次,实时光线追踪在一个像素上只采样一次,即只有一根光线穿过一个像素打到场景内(1SPP),在打到第一个地方叫primary hitpoint,然后从这点向光源连线,判断它是否在阴影内。然后就是从primary hitpoint弹射到另一个物体表面,这一点叫secondary hitpoint,再从这点连向光源判断是否在阴影内。

 

 

 

 

 

 

这里的光线从像素到场景内第一个交点时,用了光栅化来代替,因为光栅化就是一次光线的弹射。

 但是由于是1SPP,所以会有非常高的噪声,所以实时光线追踪的主要技术就是降噪。

工业做法是滤波,其核心思想是:假设前一帧是做好滤波处理的,这里使用了motion vectors的概念,motion vectors能够找到当前帧某个点在上一帧的位置,然后使用上一帧所滤波好的结果。

 

 The G-Buffers:Geometry buffer,可以很容易的获得像素对应深度、法向量、世界坐标,这是在屏幕空间下。

 

 Back Projection:在当前这一帧某个像素所对应场景内的点,获得前一帧这个点所对应的像素。

 

 有两种方法:第一种方法是用G-buffer,可以很容易的得到在某个点的空间坐标,如果物体是在运动,也需要算出前一帧物体上那个点的坐标,然后MVPE计算出在屏幕上的坐标,还有一个就是MVPE的逆变化算出空间坐标,然后再用MVPE计算出在屏幕上的坐标。当然G-buffer会更加容易。motion vector就是上一帧的空间坐标。

 

字母头上的 ~代表没有滤波,-代表还没有滤波,在得到motion vector后,用前一帧和当前帧的滤波做线性求和,就是当前帧最后的滤波结果。当前帧自己也会滤波,但再怎么滤波,由于是1SPP,效果都会非常差,所以上一帧的滤波结果占了大部分比例。但如果是运动中的物体,也会有问题。

 

 但是会有一些问题,比如场景切换问题,这样上一帧就不能用到当前帧了。

 

当摄像机在往后运动,会有更多的场景进入视线范围内。这样的话前一帧就是空白的。

 

在下图中,左边是上一帧,右边是当前帧,箱子被推向左边,是在运动的。图中蓝色点在后面的一个白色物体上面,通过motion vector可计算出在上一帧的位置,但上一帧中这个位置却在箱子上,后面的白色物体被遮挡了。这是如果使用上一帧的滤波来处理就会发生问题。

 

 如果忽略这问题,依然使用上一帧来放到下一帧中,上一帧占到90%左右,这时箱子的表面就会留到后面的白色物体上,也就是留下残影。

 

 有两种调整方案:Clamping,以上面的例子,它是把上一帧的箱子向蓝色点拉近,然后再进行线性计算。

Detection,通过motion vector计算出当前帧位置和前一帧所在位置不是同一个物体时,就可以不用前一帧了,但这样会有高噪声的问题,因为只有当前帧的滤波了。

标签:Real,一帧,光线,Tracing,物体,滤波,像素,motion,Ray
From: https://www.cnblogs.com/lsy-lsy/p/16707170.html

相关文章

  • UEC++ 容器:TArray
    说明:容器是方便我们存储数据的载体,在虚幻中,为我们提供了三种容器。分别是TArray,TMap,TSet。首先虚幻提供的容器都是同质容器,只能用来存储相同类型的数据。三种容器具备不同......
  • Smallest Subarrays With Maximum Bitwise OR
    SmallestSubarraysWithMaximumBitwiseORYouaregivena0-indexedarray nums oflength$n$,consistingofnon-negativeintegers.Foreachindex$i$from$......
  • [LeetCode] 2007. Find Original Array From Doubled Array
    Anintegerarray original istransformedintoa doubled array changed byappending twicethevalue ofeveryelementin original,andthenrandomly sh......
  • 2007. Find Original Array From Doubled Array
    Anintegerarray original istransformedintoa doubled array changed byappending twicethevalue ofeveryelementin original,andthenrandomly ......
  • Function pointer array
    #include<iostream>usingnamespacestd;doublesum(constdouble,constdouble);doubleproduct(constdouble,constdouble);doublesubtract(constdouble,c......
  • ArrayList 为什么线程不安全【转载】
    一、源码分析首先看看这个类所拥有的部分属性字段:1publicclassArrayList<E>extendsAbstractList<E>2implementsList<E>,RandomAccess,Cloneable,java.io.......
  • FormArray 调整数据位置
    getbeans(){returnthis.validateForm.get('beans')asFormArray;}change(fromIdx,toIdx){constformGroup=this.beans.at(fromIdx);this.beans.......
  • npm ERR! code E401 npm ERR! Unable to authenticate, need: Basic realm="Artifacto
    npminstall后报了下面这个错误:npmERR!codeE401npmERR!Unabletoauthenticate,need:Basicrealm="ArtifactoryRealm"如图:npmconfiglist命令找到.npmrc位......
  • 3dsmax+vray5进行分布式渲染
    环境我的两台电脑软件是一样的:win11+3dsmax2020+vray5update2.2。台式机1硬件是12900+RTX3080Ti,台式机2硬件是12900KF+RTXA4000。两台电脑都是在同一个......
  • array.js 说明
    文件说明:数组操作集合引入代码:import$arrayfrom'@/common/js/array.js'varlists=['桌子','椅子','电视','空调','冰箱']//从数组中随机抽取二个元素varg......