gpu pro360 1. Quadtree Displacement Mapping with Height Blending总结

- 概要
- 讲了quad displacement mapping,其鼻祖是parallax mapping.parallax mapping的原理:就是在渲染物体的时候多加一张表是物体表面坑洼成都的depth map,然后在tangent空间做一个简单的raymarch:所渲染的点实际上是个坑,根据depth map可以知道这个坑的半径大小,于是可以沿着tangent space的view向量做个ray march,最终得到视线实际会碰撞到的表面点的uv,再在那一点上采normal、diffuse等来做surface shading。简单的办法很耗:因为ray march做linear search不光需要好几步、还有可能一步直接穿透了薄的几何表面。

- 以往类似的技术
- relief mapping:linear search+binary search(在发现某一步穿透后再这一步和之前一步间做binary search)
- parallax occlusion mapping(POM):不用最后的binary search,而是用最后两点的depth值做权重差值。据说也能得到和relief mapping差不多的效果,而计算就简化了
- cone step mapping:需要额外的precomputed数据:cone map。就是在depth map的每个像素点上计算一个cone(方向都是垂直平面朝上),cone用来描述这个像素所在的坑的大小(假如旁边像素比较矮、则cone的开口角度会特别大,反之如果周围都是比当前像素高很多的高地(当前像素在深坑里)则cone开口角度会特别小。这样cone map就conservatively地描述出了表面上方地空着的空间,raymarch的时候在每个像素点不再使用固定步长做步进,而是直接让ray和cone相交、求交点,再从交点开始下一步迭代。
- relaxed cone step mapping:cone step mapping的一个问题是:由于cone map是conservative,每个cone的开口角度都会比较小,导致每一步的步子都不大。所以relaxed cone step mapping把cone map的生成方式做了修改:保证ray在cone里走的时候有可能能穿过depth map表面、但是最多只穿过一次(不会出现穿透薄墙的情况)。这样每个cone的开口角都能大不少

- QDM原理
- 可以归类为用了precomputed data的方法。额外的数据是depth map的mip,且每层mip是那一块的max.
- traverse的流程就成了先按照大的mip来traverse,如果整块的高度都在当前ray一下则跳过,否则descend mip
- QDM的optimization
- Convergence speed-up.在每次跨过block boudary的时候提高采样mip,为了避免在刚开始descend几次后以后就一直再用小步长的情况
- Fixed search step count. 当视线平行地表的时候还是无论如何都对不了,所以需要个上限
- Linear filtering step. 就是在第一次penerate surface后的处理,这里选择了POM的方式,做个差值
- LOD scheme. iteration数应该和view的角度有关,越是平行,需要的iteration越多。而且离得远的情况下甚至不需要细化到mip0也不会有视觉上的不同
- Storage. 因为这里的depth map是要精确数据,所以推荐无损
- Comparision. 512一下时似乎RCSM有优势,不过RCSM要预烘焙很久。。。

- self-shadow
- 最耿直的做法:先到的P(parallax offset point,要得到这个得先从view做raymarch),然后从light往P做raymarch,看是否被遮蔽。要软阴影得多来几次
- POM提出了一种软阴影方法(horizon visibility queries):算shadow coefficent,在raymarch的每一步算height的diff和sample距离的比值(高度差距离比).但是要效果好就得多采几步
- QDM的搞法:基本上还是POM的思路,只不过是更有QDM的特色了---在远处使用糙MIP(因为远处的sample的影响更小,所以用糙IMP代替)

- AO
- 没啥花样,耿直地用sample采样来积分。说是jittered比单纯翻倍sample要好

- Surface Blending
- alpha blend, 没啥好说的
- Raytracing Blended Surfaces
- 首先这个不是alpha blend,完全不同。
- 最耿直地做法是分别raymarch每一层,然后对结果做blend.N次raymarch,耗
- 如果用了per-vertex来blend的话,同一个点在不同view下看的时候会用不同的vertex差值到的值来blend,会有不同的显示结果,hence,view dependent。
- 解决办法是用per pixel的blend数据。而且是搞成在每一步把4层的depth blend成一个depth用来算intersection
- Height field blend
- 加了要给顶点上的blend weight,用来加入更改多的variation,但是,这导致了view dependent float的问题
- 一个微小的改动:不是要把4个channel的depth给weighted blend起来了,而是直接找最大的。这样比起之前的方法,depth的值变大了,所以更容易相交了,所以需要的步数减少了、所以性能提升。。
- QDM with Height Blending.mip相关的,有些特殊的地方

- two worlds2的case study
- General terrain blend.
- 用的是linear search + piecewise approximiation(POM?)
- vertex blend(会有floating)
- 用了height blend optimizaiton
- parallax可以在每块上switch off
- Special terrain features.
- 细节用decal(犯得着么。。。)
- 用QDM+softshadow
- General object surface.
- linear search+piecewise approximiation
- 对于有quality需求的用QDM+1024
- Surface Rendering Pipeline
- 提到了一点:小尺寸贴图converge特别快,所以要美术去blurr
- 反复提到了一点:很多属性是生成出来的(说是为了内存,可是你生成出来就不占内存了么?难道是在shader里生成?那真是服了)
- 在city里, specular term都是从diffuse生成的。说是会用一个美术可选的特殊function来modify
- terrain更狠。只需要一张32bit的DXT5 RGBA,从这里生成normal、specular roughness,intensities

- 存疑的地方

    - RCSM的生成算法,感觉有点问题,应该只是个近似的算法,似乎不能100%保证用了RCSM就不会有穿透。

- reference

    - GPUGem3C18. Relaxed Cone Stepping for Relief Mapping
    - UE4中的parallax occlusion mapping https://www.youtube.com/watch?v=4gBAOB7b5Mg

猜你喜欢

转载自blog.csdn.net/killer4747/article/details/80722783