屏幕空间实时全局光照(续) |
您所在的位置:网站首页 › 屏幕空间反射质量有什么用 › 屏幕空间实时全局光照(续) |
屏幕空间实时全局光照 Realtime Global Illumination(Screen Space cont.)
本节课内容:
本节课主要去讲述剩余两种Screen Space 的GI算法思路SSDO和SSR (其实感觉GTAO更重要) 什么是SSDO? 下图是SSAO和SSDO的对比 在SSDO中,我们要用直接光照的信息,但不是从RSM中获得,而是从ScreenSpace中得到。 步骤SSDO的做法于path tracing很像,假设在shading point 的P点,随机的往某一个方向打出一根光线: 1.如果光线没有碰到物体,则认为P点这里接受直接光照2.如果碰到了一个点Q,那么算出Q点接受的直接光照打到P点的贡献,从而求出P点的间接光照。![]() AO:在AO中我们认为红色的框里能接收间接光照,黄色框里无法接受间接光照,然后求出加权平均的visibility值,也就是假设间接光照是从比较远的地方来的; DO:在DO中,我们认为红色框里接受到的是直接光照,而黄色框里才是接受到的间接光照,因为红色框里的光线打不到用来反射的面,因此这些方向上就不会有间接光照,黄色框里的光线能达到物体上,P点接受到的是来自红色框的直接光照 + 黄色框里的间接光照,也就是假设间接光照是从比较近的反射物来的。 其实这两个假设都不是完全正确的,物理真实的情况是这两种的混合:近处是DO,远距离是AO,因此AO与DO也并没有矛盾。 回到渲染方程上,将没有遮蔽的与遮蔽的方向上的光照分开考虑,那么对于DO如何解Rendering Equation: • 当V=1时是直接光照,而DO的计算是计算间接光照的,因此这个我们完全不用去计算与考虑。 SSDO的核心是找哪些patch(图像块)会被挡住,也就是对点P提供间接光照贡献的是哪些点,做法是与AO完全一样的。 我们同样考虑点P法线部分的半球,判断从P点往A,B,C,D四个方向看会不会被挡住,由于是屏幕空间的算法,因此这里我们同样不考虑在3D场景中A,B,C,D四点会不会与P连成光线,只考虑从camera看去,A,B,C,D与P连成的光线会不会被挡住。 这里A/B/D这三个点的深度比从camera看去的最小深度深,也就是说或PA,PB,PD方向会被物体挡住,因此会为P点提供间接光照。然后把我们用在RSM中讲到的计算间接光照的方法这些点对P的贡献加起来。 问题: P点对于半球上的点可见性是通过Camera对这些点的可见性来近似计算的,存在于屏幕空间中丢失信息的问题,下图是一个很明显的例子,当黄色的面朝向屏幕的时候,地面的SSDO信息是正确的,而当旋转过去之后,就看不到SSDO的信息了。 老师说更愿意把他叫做Screen space Raytracing(SSR),只把它理解成反射的话其实比较狭隘。 其实也可以直接叫做SSGI。 首先什么是SSRSSR 仍然是一种在RTR中实现GI的方式;是在屏幕空间做光线追踪不需要知道3D空间中的三角形,网格,加速结构等3D信息,只需要在屏幕空间中已有的信息,也就是从camera看去场景的得到的这样一层“壳”。我们用生活中的一些实例来看: 图中地面会反射出灯光和建筑物本身的一些信息,因此反射本质上来说就是全局光照。 那么任何一个点反射的信息是什么,是从哪里得到的? 白框里反射的是红框内的场景信息,也就是说我们并不需要3D场景的什么信息,而是从屏幕空间里已有的信息得到,也就是反射的绝大多数信息是屏幕内已有的信息,这就是屏幕空间反射的核心思路。 基础的SSR算法:镜面反射假设场景中已经渲染出来了上面的部分,对于地面还没有进行渲染,如何把反射的信息加进去。 除了可以做specular反射,还可以做glossy的反射: 即在知道几何和法线信息后,SSR可以做任何的关系追踪。 specular反射: 我们有一个还没有进行反射的场景,如shaded scene上的地面还没有得到反射的结果得到图中的normal信息和深度信息进行SSR,我们想要的是对于地面的每一个pixel,我们都想计算出其反射到场景中的得到的值是多少得到反射的值后,将结果加到场景中去,也就是在地面上的黄点反射到场景的壳上的绿色,进行求交,算到的结果加入到黄点中得到一个镜面反射的效果 怎么在屏幕空间求反射光与场景的相交(RayMarching): Linear Raymarch最简单的方法是:linear raymarch 黄色是shading point,虚线是反射光,假设camera在右边,那么从camera看去,场景的壳就是曲线。 我们是为了找到反射光与场景“壳”的交点: 沿着反射方向以一个固定的步长逐步前进,并将每次停止时的深度与壳的深度进行比较,如果浅于壳,则继续前进,比壳深,则停止求交,也就是我们用深度来进行可见性判断。质量取决于步长的大小,步长小越精准,同时计算量也越大,因此步长太大太小都不行,在没有SDF的情况下,步长只能是一个定值。由于步长是由我们自己来决定的,太长太短都有其各自的问题,因此我们引入另一种动态决定步长的方法: Hierarchical Raytrace
为了能得到这个信息我们需要做一个准备工作,把场景的深度图,做一个mip-map,但这个跟平常的mip-map不一样: 高一级的mipmap存的并不是周围四个像素的平均深度,而是四个像素中深度的最小值。
为什么要做最小深度图mipmap呢? ![]() 我们知道mip-map是一个二维的东西,这是一维的表示,一个格子表示一个像素,一共有八个格子。 每一格判断是level 0每两个是level 1每四个是level 2我们这里先以level 1为例子. 这就是他的一个基本逻辑,从而让我们可以快速的跳过很多格子。 也就是我们对场景的壳从深度方面做了一个加速结构,我们来看一下他的伪代码: 停下来的两个条件: 找到了交点一直没找到交点Mipmap可以做范围查询,可以做正方形查询,但是做不了准确的起点不在2的k次方上的深度的查询。 总结raymarching: 由于我们不知道以一个多长的固定的步长来逐步前进求交点,因此我们用高一级的Mipmap存的并不是周围四个像素的深度平均,而是四个像素中深度的最小值来动态的决定步长,从而可以快速的求到任何光线与场景壳的交点。 SSR存在的问题但是SSR仍然有屏幕遮挡的问题: 不在屏幕中这层“壳”的信息是不会被反射的,丢失正常的反射信息 。 我们可以看到手指那边得到了一个可笑的结果,这就是SSR的问题,他只会反射处Camera所看到的,而不是3D场景中真实存在的所有的点,这也是我们学到的Screen Space的三个算法的一个通病,整体来看只有SSDO要稍微好点。 还有一个就是屏幕边缘信息的缺失问题: 至此我们完成了屏幕空间光线追踪的部分,但是我们还没有完成如何计算shading。 这部分与路径追踪的方法完全相同,仅仅是把光线与场景求交变成了光线与“壳”求交,因此路径追踪的算法在这里是可以直接使用的。 对于任何一个shading point ,看到的是radiance就是对半球进行积分,如果是specular的物体,那么相当于光线打到物体的哪里,就用它所发出的radiance就可以。
这里我们同样需要假设反射物/次级光源,是diffuse的情况,地板之类的接受物可以是任何物体。 问题: Q1:Flux Intensity是否存在平方反比衰减的问题?A1:不存在,这里做的是BRDF sampling,并不是某个指定次级光源到shading point,因此并不存在平方反比衰减的情况。Q2:是否能够处理好次级光源与shading point 的可见性问题?A2:由于是路径追踪tracing 计算出来的,看到的一定是能够看见的,因此是没有这个问题的。屏幕空间反射中的自然特殊现象: 由于结果是tracing出来的,因此很多现象是自然就能做到的,并不用做trick,类似很多模糊等现象可以直接实现。 1.sharp and blurry reflection:glossy物体反射的模糊现象。 优点: 可以很快的做glossy与specular的反射质量很好没有spikes尖点与遮蔽的问题缺点: 在diffuse物体上并不是很高效丢失屏幕外的信息,但这个是屏幕空间的局限性,而不是光线追踪的问题 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |