探究软阴影实现方式1

目前主流的软阴影的实现方式主要有以下几种,我们来分别的探究一下他们的实现方式并且对他们进行简单的分析。

  • 通过过滤阴影贴图(PCF、PCSS)
  • 预处理阴影贴图(VSM、ESM)
  • 屏幕空间模糊(SSSS)

1.PCF(Percentage-Closer Filtering)

百分比渐近过滤(PCF)是一个简单,常见的进行阴影边缘反走的技术。它通过在片段周围进行采样,然后计算样本比片段的更接近光源的比例,使用这个比例对散射光和镜面光成分进行缩放,然后对片段进行着色。使用这一技术后,阴影边缘看上去进行了模糊一样。

但对于较大物体的内部的采样是一个较大的浪费,我们并无法只针对物体边界进行采样,所以在性能是具有很大的瓶颈。

2.PCSS(percentage-closer Soft Shadow)

pcss是距离相关的。2005年,Fernando发布了一种名为百分比接近软阴影(PCSS)的有影响力的方法。 它通过搜索阴影贴图上的附近区域来尝试找到所有可能的遮挡物。这些遮挡物与该位置的平均距离用于确定样本区域宽度。随着平均遮挡物越来越远离接收物并且更靠近光线,样本的表面区域的宽度增大。

如果找不到遮挡物,则该位置完全点亮,无需进一步处理。类似地,如果位置完全被遮挡,则处理可以结束。否则,继续对感兴趣的区域进行采样并计算光的近似贡献。为了节省处理成本,样本区域的宽度可用于改变采样的数量。 可以实现其他技术,例如,使用较低的采样率来获得不太重要的远距离软阴影。

PCSS的算法分成三个步骤:

  • 首先,把目标点变换到Light space
  • 然后找到周围点中的遮挡该目标点的点,记录其与光源的距离。
  • 在搜索了一定的遮挡点之后,我们会根据这些遮挡点计算出一个平均遮挡距离。如果目标点不在阴影中,平均遮挡距离为0,PCSS算法直接返回1.0。

3.VSM(variance shadow map)

允许过滤生成的阴影贴图的一种算法是Donnelly和Lauritzen的方差阴影图.该算法将深度存储在一个贴图中,并将深度的平方存储在另一个贴图中。 生成映射时可以使用MSAA或其他抗锯齿方案。 这些贴图可以模糊,mipmap,放在SAT或使用任何其他方法。可以将这些贴图视为可过滤纹理是一个巨大的优势,因为从它们检索数据时可以使用所有采样和过滤技术。

VSM:分两遍pass渲染。唯一不同的是,在第一遍pass中,存储在Shadow Map中的是一个深度值(z-depth),而在Variance Shadow Map中,存储的是两个分量(two components): 深度值与深度值的平方。这可以借助占用像素的两个通道来办到(比如R通道放深度值,G通道放深度值的平方)。接下来,就触及到该算法的核心:完成第一遍pass后,对VSM进行每单位区域(比如,仍然是2*2为一个range)的硬件线性滤波。滤波后每像素存储的两个分量,其意义就发生了微妙的变化:第一个分量表示该range内所有像素深度值的均值,也可以看作对应的期望,即上面的M1;而第二个分量表示该range内所有像素值的平方的期望,即上面的M2。依据M1和M2我们就可以求出该range的μ和σ。按照切比雪夫不等式,我们就可以估计出这片range内其深度值大于某一值t的概率上限。

第一遍pass中,我们逐一计算M1和M2并存储到VSM中,然后对这张VSM进行范围为range的硬件线性滤波;第二遍pass中,我们依然用视点角度渲染场景,对光栅化的每一像素,计算它在灯光坐标系中的深度值,并把这个值设为t;调取VSM中对应位置的像素,利用M1和M2计算出μ和σ,先判断t与μ的大小关系:如果t<=μ,则表示当前像素的深度小于等于range的深度均值,则判断它没有被遮挡;否则,判断它被遮挡,这时利用切比雪夫不等式计算出pmax(t),该值表示range内深度值大于等于t的像素个数的概率上限,这个概率可以看作比率。该比率表示光照射到当前像素的光线数量(比t小的像素表示它遮挡住了当前像素,也就是说光线没有射到该像素上;相反,则就表示射到了t上),因此,这个比率就相当于光照强度,这是一个介于0到1之间的过渡数值。用它乘以黑色,就是最后实际的阴影值。注意,我们的算法是用上限值pmax(t)近似模拟了实际比率p(t),但其实pmax(t) > p(t),只不过二者相差不大。但这个误差依然会导致一些问题,会放到下面讨论。

4.ESM(exponential shadow map)

https://blog.csdn.net/codeboycjy/article/details/6302805

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Papals

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值