【USparkle专栏】假如你深怀绝技,爱“搞点研讨”,乐于共享也博采众长,咱们等待你的参加,让才智的火花磕碰交错,让常识的传递生生不息!


一、实践需求

由于项目的树与草都选用Compute Shader除掉的GPU Instance绘制,所以需求自己完成暗影投递物的裁剪办法。也便是每一帧详细让哪些物体绘制ShadowMap。该核算的精确性会很影响树(有大量极点又需求用AlphaTest镂空)的烘托功能。之前完成了一版《暗影视锥裁剪完成》,是在世界空间暴力核算,不算直观,也不精巧。最近有一种十分不错又好理解的新思路,所以再剖析一次。

二、首要思路

  • 把物体的AABB的8个极点转到灯火空间,重新核算出AABB(与灯火空间xyz轴平行)。
  • 把视锥的6个平面与AABB也转到灯火空间。
  • 假如物体AABB的max.z < 视锥AABB的max.z,则把物体AABB的max.z设置为视锥AABB的max.z(这里是比较巧妙一步,处理了本身在视锥外但投影在视锥内的物体)。

满意以上三步后,只要做一般视锥与AABB裁剪就行了,作用演示如下:

期间也尝试过一种裁剪核算量更小但精确度稍差一点的思路,便是在灯火空间下取消z判别,当作2D几何,求交。那么核算量会小许多。主体思维和这套相同,可根据实践项目来判别要省裁剪功能还是提示裁剪精度。演示如下:

三、代码解释

为了便利自己与其他人验证算法,一般用C#完成,等落地时再转Compute Shader。为了代码明晰,一些不杂乱的核算直接用Unity的API。做Compute Shader时需求完成这些基础函数,都能找到这种标准件代码。

1. 视锥转化
把视锥体转到灯火空间,并绘制出5个视锥平面的法线(仅调试平面法线方向用),一般为了通用性视锥按6个平面处理,实践绝大部分项目,NearClip都接近0,当作一个锥体处理。转化的办法比较简单每个点通过灯火矩阵转完 重新核算AABB即可。

再聊暗影裁剪与高功能视锥除掉

再聊暗影裁剪与高功能视锥除掉

灯火空间下 视锥体AABB

2. 目标转化
把投影目标AABB也转到灯火空间,转化办法和视锥那个一样,不过要转8个极点,并做z轴方向延长。延长后的体积,便是整个暗影有效规模。这里能够做一个小优化,假如最小的z比相机最大的z还大就不用核算了,阐明在相机外侧且远离灯火的方向,不可能投影入可见区域。

再聊暗影裁剪与高功能视锥除掉

再聊暗影裁剪与高功能视锥除掉

四、再谈视锥裁剪

这样在转化后做正常视锥裁剪就行,而这部分技术就十分普遍老练。但写这篇首要是为了共享一种十分规裁剪,用于对树这种少裁剪一棵就影响帧数的项目,会比一般裁剪精确许多。

先看两种裁剪对比作用:

再聊暗影裁剪与高功能视锥除掉

一般视锥裁剪

再聊暗影裁剪与高功能视锥除掉

本方案裁剪

一般裁剪是比较保存但偏向正确和低杂乱度的模式,便是要存在至少一个视锥平面,让这AABB的8个点一同在这个平面的外部。所以全体在视锥外部,但不同极点在不同平面外部的状况就除掉不了。比方下图,没有任何一个平面能够让所有点都满意在它的外侧。

再聊暗影裁剪与高功能视锥除掉

一般裁剪逻辑代码

再聊暗影裁剪与高功能视锥除掉

不满意裁剪条件但使用除掉的状况

这是由于这种办法区别不了上图与下图2种不同状况,为了画面不犯错只能挑选保存处理:

再聊暗影裁剪与高功能视锥除掉

不满意裁剪条件但不使用除掉的状况

五、精确裁剪推导

这部分逻辑归于功能扩展,假如不是有优化烘托功能要求,不需求了解这部分,直接用惯例裁剪就好了。

首先做视锥AABB与物体AABB堆叠检测,这不满意,必定除掉(偏保存,但能加速淘汰)。

咱们把物体AABB,与视锥堆叠的办法分为2类:

  1. 物体AABB与视锥4个旁边面三角形产生磕碰的堆叠类型。
  2. 物体AABB不与视锥4个旁边面三角形产生磕碰的堆叠类型。

再聊暗影裁剪与高功能视锥除掉

物体AABB与视锥4个旁边面三角形产生磕碰的堆叠类型

再聊暗影裁剪与高功能视锥除掉

物体AABB不与视锥4个旁边面三角形产生磕碰的堆叠类型

能够这样归纳两类,假如堆叠,那么不是物体AABB与视锥4个三角形磕碰,便是物体AABB有个角点在视锥内。

由于不存在只与远平面磕碰而一同又没有极点在视锥体内的状况。由于这时分AABB会穿透视锥体,而视锥体是封闭多面体,这种时分一定会再与四个旁边面产生磕碰,所以可归到第一类里。

对应的代码如下。其间三角形与AABB磕碰函数,是用GitHub上cginc文件改的,后面落地Compute Shader还能直接用它。
github.com/bonzajplc/A…

再聊暗影裁剪与高功能视锥除掉

处理一般视锥裁剪的问题


这是侑虎科技第1541篇文章,感谢作者jackie 偶然不帅供稿。欢迎转发共享,未经作者授权请勿转载。假如您有任何独特的见地或许发现也欢迎联系咱们,一同讨论。(QQ群:465082844)

作者主页:www.zhihu.com/people/jack…

再次感谢jackie 偶然不帅的共享,假如您有任何独特的见地或许发现也欢迎联系咱们,一同讨论。(QQ群:465082844)