Unity可编程渲染管线系列(五)方向阴影(级联贴图 Cascaded Maps)

目录1 方向光阴影1.1 配置阴影1.2 渲染阴影1.3 阴影距离1.4 调查阴影1.5 钳位阴影瓦片1.6 总是使用裁切1.7 基于距离进行阴影裁减2 级联阴影贴图2.1 级联数量2....
摘要由CSDN通过智能技术生成

目录

1 方向光阴影

1.1 配置阴影

1.2 渲染阴影

1.3 阴影距离

1.4 调查阴影

1.5 钳位阴影瓦片

1.6 总是使用裁切

1.7 基于距离进行阴影裁减

2 级联阴影贴图

2.1 级联数量

2.2 级联分割

2.3 只对主方向光使用级联

2.4 重用代码

2.5 渲染级联

2.6 采样阴影贴图

2.7 选择正确的级联

本文重点:

1、支持多个定向光阴影

2、控制阴影距离

3、定义分离的主光源

4、渲染和采样一个级联阴影贴图

5、让剔除球体生效

这是涵盖Unity的可脚本化渲染管线的教程系列的第五部分。这次,我们将添加对定向阴影的支持。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

本教程使用Unity 2018.3.0f2制作。

(4个使用了阴影的定向光,一个带有级联)

1 方向光阴影

从概念上讲,定向灯与聚光灯没有什么不同。它们是相同的,只是无限远。我们对聚光灯阴影使用的方法也适用于它们,但进行了一些调整。我们将增强管线,使其支持可以投射阴影的定向光和聚光灯的混合。

1.1 配置阴影

当前,ConfigureLights仅在聚光灯下处理阴影数据。但是当我们也支持定向阴影时,同一段代码需要使用两次。因此,将相关代码复制到一个单独的方法中,根据灯光索引和阴影灯光进行工作,然后返回阴影数据。

在ConfigureLights中为聚光灯使用新方法。

并将其用于定向灯。

由于渲染定向阴影贴图时存在一些差异,因此,我们在此处表示正在处理定向光。可以通过将阴影数据的Z分量用作标志来做到这一点。

1.2 渲染阴影

此时,我们在阴影贴图中为定向光保留了图块,但它仍然没有用,因为RenderShadows正在为聚光灯计算其矩阵。我们只能将ComputeSpotShadowMatricesAndCullingPrimitives用于聚光灯,而必须使用其他方法来计算定向光的矩阵。

首先,从检查是否有有效阴影中拉出对ComputeSpotShadowMatricesAndCullingPrimitives的调用。这样可以更轻松地对定向光进行不同的处理。

接下来,如果阴影数据指示我们有定向光,则改为调用ComputeDirectionalShadowMatricesAndCullingPrimitives。该方法具有更多参数,因为它允许我们使用阴影级联,在此我们不再做。我们提供的第一个参数是光指数,其次是级联指数和级联数量。现在不使用级联,索引为零,计数为1。之后是一个三分量向量来定义级联拆分,我们将使用(1,0,0)。接下来是图块大小(整数),然后是靠近平面的阴影值,最后是矩阵和拆分数据输出。

这为我们提供了正确的方向阴影矩阵。除此之外,分割数据还包含有效的剔除范围。这是一个包围所有需要渲染以创建有效方向阴影贴图的对象的球体。这对于定向阴影很有用,与聚光灯不同,它们会影响一切。通过将剔除球分配给阴影设置的分割数据,我们可以使用剔除球来减少必须渲染到阴影贴图中的形状数量。

聚光灯没有有效的剔除球体,但是由于没有效果,我们仍然可以对其进行分配。因此,我们不必在此处区分光源类型。

1.3 阴影距离

现在,我们应该为定向光指定有效的阴影贴图,但是它们似乎是空的,除了可能有一个小点之外。这是因为贴图必须覆盖摄像机可以看到的所有内容,默认情况下,最多可以看到1000个单位,并且由摄像机的远平面控制。无论是否实际存在几何图形,都需要覆盖该区域,因此贴图会拥有一个非常大的比例尺。大幅减少相机的远平面距离将最终使阴影出现。

阴影的渲染距离与相机的远平面无关,这只是默认行为。存在一个阴影距离参数,该距离控制渲染阴影的距离。阴影距离通常比相机的远平面小得多。这既限制了必须渲染的阴影数量,又使定向阴影贴图覆盖较小的区域。

向MyPipeline添加shadow distance字段,该字段是通过其构造函数设置的。从相机中将其提取后,再将其分配给剔除参数。由于渲染阴影超出相机可见的范围没有意义,因此请使用阴影距离和相机远平面中的最小值。

将阴影距离的配置选项添加到MyPipelineAsset,并为其指定一个合理的默认值,例如100。

(阴影距离设置为10)

1.4 调查阴影

一旦阴影距离已充分减小,定向阴影就会出现了。现在,让我们以很小的距离(例如10)工作。要获得对贴图所覆盖内容的良好印象,请将灯光的阴影偏差设置为零,并使用大平面作为地面。从单个定向灯开始。

(方向阴影 偏差设置为0)

由于零偏差,以及地面上的自阴影,我们可以大致看到阴影贴图覆盖的区域。与聚光灯阴影不同,定向阴影贴图随摄影机一起移动。同样,阴影贴图的边缘仍然可以超出其范围来影响场景。发生这种情况是因为我们最终采样超出了地图的边缘,从而有效地将其边缘扩展到无穷大。当我们有一个以上的阴影光时,这种拉伸就消失了,因为然后使用剪切清理每个瓦片的边缘。

(2个阴影贴图瓦片,一个定向光和一个聚光灯)

但是,当有多个图块时,我们可能最终会超出定向图块的边界进行采样,并最终从错误的图块进行采样。瓦片越多,效果越差。

(两个定向光 一个聚光灯 产生的阴影)

1.5 钳位阴影平铺

定向阴影贴图很麻烦,因为无论覆盖什么区域,都需要在各处采样。解决方案是将阴影采样固定在图块上。这是通过将阴影位置转换为0–1范围,缩放并偏移到正确的图块之前,将其阴影位置钳位来完成的。不用钳位的话,可以在MyPipeline中计算整个变换矩阵,但是现在我们必须将图块变换步骤移至着色器。

切片缩放需要切片比例,因此我们必须将其发送到着色器。让我们为此添加一个全局阴影数据向量,也可以使用它稍后存储更多的东西。将其命名为_GlobalShadowData并跟踪其着色器标识符。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值