最近动力十足!再上一篇!

业余翻译,若有不周到之处,还请多多指教!

实时渲染(第四版)Real-Time Rendering (Fourth Edition)

第7章 阴影 Chapter 7 Shadows

7.4 阴影贴图 Shadow Maps

1978年,Williams [1888]提出可以使用基于 z 缓冲区的通用渲染器在任意对象上快速生成阴影。这个想法是使用 z 缓冲区从要投射阴影的光源位置去渲染场景。光所“看到”的部分会被照亮,其余的都在阴影中。生成此图像时,仅需要 z 缓冲。照明,纹理化,将值写入颜色缓冲区,这三个步骤可以被关闭(?)

现在,z 缓冲区中的每个像素都包含最靠近光源的对象的 z 深度。我们将 z 缓冲区的全部内容称为阴影贴图(shadow map),有时也称为阴影深度图(shadow depth map)或阴影缓冲区(shadow buffer)。要使用阴影贴图,场景会进行第二次渲染,但这次是相对于观察者的渲染。渲染每个绘图图元时,会将它在每个像素处的位置与阴影贴图进行比较。如果渲染的点比阴影贴图中的对应值更远离光源,则该点在阴影中,否则就不在阴影中。我们通过使用纹理映射来实现此技术。参见图 7.10。阴影贴图是一种流行的算法,因为它是相对可预测的。建立阴影贴图的成本与渲染图元的数量大致成线性关系,并且访问的时间是恒定的。阴影贴图可以一次生成,并且可以在光线和对象不移动的场景(例如计算机辅助设计)的每一帧中重复使用。

当生成单个 z 缓冲区时,灯光只能像摄像机一样在特定方向上“看”。对于诸如太阳之类的远距离方向光,该光的观察角度会设置为包含所有将阴影投射到眼睛所见的视锥体中的对象。如果光线使用正交投影,那么其视线必须在 x 和 y 方向足够宽且足够高才能看到这组对象。局部光源需要尽可能进行类似的调整。如果局部光源距离阴影投射对象足够远,则单个视锥体就足以包含所有这些内容。或者,如果局部光源是聚光灯,则它具有与之相关的天然视锥体,并且视锥体外的所有内容都不会被照亮。

如果局部光源在场景内部并且被阴影投射器包围,则典型的解决方案是使用六视图立方体,这类似于立方体环境映射 [865]。这些六视图立方体被称为全向阴影贴图(omnidirectional shadow maps)。全向阴影贴图的主要挑战是避免在两个单独的地图相交处的接缝处出现伪像(artifacts)。King and Newhall [895]深入分析了问题并提供了解决方案,而 Gerasimov [525]提供了一些实施细节。Forsyth [484,486]提出了一种用于全向光的通用多视锥体分割方案,该方案还在需要时提供了更高的阴影贴图分辨率。Crytek [1590,1678,1679]根据每个视图的投影视锥体的屏幕空间覆盖范围,可为点光源设置六个视图中每个视图的分辨率,并且所有贴图都存储在纹理贴图集中。

并非场景中的所有对象都需要渲染到光源的视锥体内。首先,仅需要渲染可以投射阴影的对象。例如,如果已知地面只能接收阴影而不能投射阴影,则不必将其渲染到阴影贴图中。

 

图7.10. 阴影贴图。在左上方,通过存储视图中的深度来形成阴影图。在右上方,显示了眼睛看着两个位置。在\large \textbf{v}_{a}点看到该球体,发现该点位于阴影贴图上的纹理像素 \large a 处。存储在该处的深度不(远)小于光的 \large \textbf{v}_{a} 点,因此该点被照亮。在点 \large \textbf{v}_{b} 处命中的矩形比存储在纹理像素 \large b 处的深度更加远离光源,因此在阴影中也是如此。左下角是从灯光角度看的场景视图,白色则更远。右下角是使用此阴影贴图渲染的场景。

 

从定义上讲,阴影投射器是指位于灯光视锥体中的角色。可以通过多种方式增加或收紧这种视锥体,使我们可以安全地忽略一些
阴影投射器 [896,1812]。让我们来考虑一下观察者可见的阴影接收器组。这组对象在沿光源的视线方向的最大距离内。超出此距离的任何物体都不能在可见的接收器上蒙上阴影。同样,可见接收器的集合可能会比光源的原始 x 和 y 视图范围小。见图 7.11。另一个例子是,如果光源在观察视锥体的内部,则该视锥体之外的任何物体都不能在接收器上投射阴影。仅渲染相关对象不仅可以节省渲染时间,还可以减小光源的视锥体所需的大小,因此可以提高阴影贴图的有效分辨率,从而提高质量。此外,视锥体的近平面距离光源越远越好,并且远平面越近越好,这也是有帮助的。这么做可以提高 z 缓冲区的有效精度 [1792](第4.7.2节)。

阴影贴图的一个缺点是阴影的质量取决于阴影贴图的分辨率(以像素为单位)以及 z 缓冲区的数值精度。由于阴影贴图是在深度比较期间进行采样的,因此该算法容易出现走样问题,尤其是靠近对象之间的接触点。一个常见的问题是自阴影走样(self-shadow aliasing),通常被称为“表面痤疮”(surface acne)或“阴影痤疮”(shadow acne),其中三角形会错误地对自身产生阴影。此问题有两个来源。一种就是处理器精度的数值极限。另一个来源是几何图形,这是因为使用了点样本的值来表示区域的深度。也就是说,为光源生成的样本几乎永远不会与屏幕样本位于相同的位置(例如,像素经常在其中心进行采样)。将灯光的存储深度值与要查看的曲面的深度进行比较时,灯光的值可能会略低于曲面的深度,从而导致自阴影。这种错误的影响如图 7.12 所示。

图7.12. 阴影贴图偏差伪像。在左侧,偏差值(bias)太低,因此发生自阴影。在右侧,高偏差值会导致鞋子不产生接触阴影。阴影贴图的分辨率也太低,从而使阴影显得块状。(图像来自 Christoph Peters 的阴影演示。)

 

帮助避免(但不总是会消除)各种阴影贴图伪像的一种常用方法是引入偏差值参数。在检查阴影贴图中发现的距离与被测位置的距离时,会从接收器的距离中减去一个小的偏差值。见图 7.13。该偏差可能是一个恒定值 [1022],但是当接收器未完全面向光线时,这样做可能会失败。一种更有效的方法是使用与接收器与光的角度成比例的偏差值。表面远离光的程度越大,偏差值就越大,这样就可以避免此问题。这种类型的偏差值称为斜率比例偏差值(slope scale bias)。这两种偏差都可以通过使用诸如 OpenGL 的 glPolygonOffset 之类的命令来施加,以使每个多边形向远处偏离光线。请注意,如果表面直接面向光,则斜率比例偏差值根本不会将其向后偏移。因此,我们会将恒定偏差与斜率比例偏差混合使用以避免可能的精度误差。斜率比例偏差通常也被限制在某个最大值,因为当从光的角度观察接近于边缘的表面时,切线值(tangent value)可能会非常高。

 

图7.13. 阴影偏差值。将表面渲染为顶灯(overhead light)的阴影贴图,垂直线表示阴影贴图的像素中心。遮挡物深度记录在 × 位置。我们想知道在三个显示为点的样本处表面是否被照亮。每个阴影贴图深度值的最接近值以相同的颜色 × 表示。在左侧,如果未添加任何偏差值,则蓝色和橙色样本将被错误地确定为处于阴影中,因为它们距光源的距离比其对应的阴影贴图深度更远。在中间,从每个样本中减去恒定的深度偏差值,可使每个样本更靠近光线。蓝色样本仍被认为是处于阴影中,因为它离光线比被测试的阴影贴图深度更近。在右侧,通过将每个多边形移离与光线成比例的斜率来形成阴影贴图。现在,所有采样深度都比其阴影贴图深度更近,因此都被照亮了。

 

Holbert [759,760] 引入了法线偏移偏差(normal offset bias),它首先使接收器的世界空间位置沿表面法线方向稍微偏移一点,与光的方向和几何法线之间的角度的正弦成正比。请参阅第 250 页的图 7.24。这不仅会改变深度,还会改变在阴影贴图上测试样本的 x 和 y 坐标。随着光的角度向表面变浅,此偏移量增加,我们希望看到样品在表面上方足够远以避免自阴影。该方法可以可视化为将样品移至接收器上方的“虚拟表面”(?)。该偏移量是一个世界空间距离,因此 Pettineo [1403] 建议根据阴影贴图的深度范围对其进行缩放。Pesce [1391] 提出了沿摄像机视图方向增加偏差的思路,该思路也可以通过调整阴影贴图坐标来实现。在第 7.5 节中讨论了其他偏差方法,因为那里介绍的阴影方法还需要测试几个相邻的样本。

太大的偏斜会引起称为漏光(light leaks)或彼得潘宁(Peter Panning)(?)的问题,在该问题中,对象似乎悬浮在底层的表面之上。之所以会出现这种伪像,是因为该物体的接触点下方的区域(例如脚下的地面)被推得太向前,因此不会收到阴影。

避免自阴影问题的一种方法是仅对阴影贴图渲染背面。这种方案称为二次深度阴影贴图(second-depth shadow mapping) [1845],此方案在许多情况下都可以很好地工作,特别是对于不能手动调整偏差的渲染系统而言。当对象是双面的,薄的或彼此接触时,就会出现问题情况。如果对象是网格的两面都可见的模型(例如,棕榈叶或纸),则由于背面和正面位于相同的位置,因此可能会发生自阴影。同样,如果不执行任何偏移偏差操作,则轮廓边缘或薄物体附近可能会出现问题,因为在这些区域中,背面接近正面。增加一个偏差可以帮助避免表面痤疮(surface acne),但是该方案会更容易造成漏光,因为接收器和遮挡物背面之间在接触点之间没有分隔。见图 7.14。选择哪种方案可能取决于具体情况。例如,Sousa 等人 [1679] 发现使用正面去生成太阳的阴影,背面去生成室内照明阴影,这样最为适合。

图7.14.  以上是顶灯环境下的阴影贴图表面。在左侧,面向光的表面(标记为红色)被发送到阴影贴图。表面可能被错误地确定为阴影自身(acne,“痤疮”),因此需要远离光线。在中间,仅将背面三角形渲染到阴影贴图中。向下增加这些遮挡器的偏差可能会使光泄漏到位置 a 附近的接地平面上;向前增加偏差会导致阴影标记为 b 的轮廓边界附近的照明位置被视为阴影。在右侧,在阴影贴图的每个位置上找到的最接近的正面和背面三角形之间的中点处形成中间表面。点 c 附近可能会发生光泄漏现象(第二深度阴影贴图也可能发生),因为最近的阴影贴图样本可能在此位置左侧的中间表面上,因此该点将更靠近光源。

 

请注意,对于阴影贴图,对象必须是“水密的”(watertight,流形和封闭的,即实心;第16.3.3节),或者必须在贴图上同时显示正面和背面,否则对象可能无法完全投射阴影。Woo [1900] 提出了一种通用方法,该方法试图在字面上仅使用正面或背面进行阴影生成,成为一种快乐的媒介(?)。这个想法是将实体对象渲染到阴影贴图上,并跟踪两个最接近光源的表面。我们可以通过深度剥离或其他与透明度相关的技术来执行该过程。两个对象之间的平均深度会形成一个中间层,该中间层的深度用作阴影贴图,有时这也称为双重阴影贴图(dual shadow map)[1865]。如果物体足够厚,则自阴影和漏光伪像会降至最低。Bavoil 等人 [116] 讨论了解决潜在伪像的方法,以及其他实现细节。主要缺点是使用两个阴影贴图会造成额外的消耗。Myers [1253] 讨论了遮挡物和接收器之间由艺术家控制的深度层。

随着观察者的移动,灯光的视锥体通常会随着阴影投射器的设置而改变大小。这样的变化又会导致阴影在帧与帧之间产生略微偏移。发生这种情况是因为光源的阴影贴图采样的是与光源不同的一组方向,并且这些方向与前一组方向不一致。对于方向光,解决方案是强制生成的每个后续阴影贴图在世界空间中保持相同的相对纹理像素光束位置 [927、1227、1792、1810]。也就是说,你可以将阴影贴图视为在整个世界上施加二维网格化参照系,每个网格单元代表贴图上的一个像素样本。在移动时,将为这些相同的网格单元的不同集合生成阴影贴图。换句话说,光线的视线投影被强制移至该网格以维持帧与帧之间的连贯性。

 

7.4.1 分辨率增强 Resolution Enhancement

与使用纹理的方式类似,理想情况下,我们希望一个阴影贴图纹理覆盖大约一个图像像素。如果我们的光源位于与眼睛相同的位置,则阴影贴图将与屏幕空间像素完美地一对一映射(并且没有可见阴影,因为光线恰好照亮了眼睛所看到的)。光线的方向一改变,此每像素比率就会改变,这可能会导致伪像。一个例子如图 7.15 所示。由于前景中的大量像素与阴影贴图的每个纹理像素相关联,因此阴影会呈现块状且定义不清。这种不匹配称为透视走样(perspective aliasing)。如果一个表面接近光线边缘,但面向观察者,则单个阴影贴图纹理像素也可以覆盖许多像素。这个问题被称为投影走样 [1792]。见图 7.16。可以通过增加阴影贴图的分辨率来降低其块状性,但是这要以增加内存和处理为代价。

图7.15. 左侧的图像是使用标准阴影贴图创建的。右边的图像使用 LiSPSM 。显示了每个阴影贴图的纹理像素的投影。这两个阴影贴图具有相同的分辨率,不同之处在于 LiSPSM 重新构造了光源的矩阵,以在靠近观察者的位置提供更高的采样率。(图片由维也纳科技大学的 Daniel Scherzer 提供。)

图7.16.  左边的灯几乎在头顶上。相比于真实世界的眼睛所看到的,这里由于分辨率较低,阴影的边缘有点参差不齐。在右侧,光源接近地平线,因此每个阴影纹理像素在水平方向上覆盖了更大的屏幕区域,因此边缘更多锯齿。(由 TheRealMJP 的 Github 上的“ Shadows” 程序生成的图像。)

 

还有另一种方法来创建灯光的采样图案,使其更接近于相机的图案。这是通过更改场景投影到灯光的方式来完成的(?)。通常,我们认为观察视图是对称的,观察向量(view vector)位于视锥的中心。然而,观察方向仅定义了观察平面,而不定义了哪些像素被采样。定义视锥的窗口可以在此平面上移动,倾斜或旋转,从而创建四边形,从而提供不同的世界视图空间映射。四边形仍按固定间隔进行采样,因为这是线性变换矩阵的性质以及 GPU 对其的使用。我们可以通过改变光源的观察方向和观察窗口的边界来修改采样率。见图 7.17。

将光线的视线映射到眼睛的视线有 22 个自由度 [896]。对这种解决方案空间的探索导致了几种不同的算法,它们都试图更好地将光的采样率与眼睛的采样率匹配。方法包括透视阴影贴图(perspective shadow maps,PSM)[1691],梯形阴影贴图(trapezoidal shadow maps,TSM)[1132]和光照空间透视阴影贴图(light space perspective shadow maps,LiSPSM)[1893、1895]。有关示例,请参见第 254 页的图 7.15 和图 7.26。此类技术被称为透视变形(perspective warping)方法。

这些矩阵变形算法的一个优点是,除了修改光源矩阵外,不需要做其他工作。每种方法都有其优点和缺点 [484],因为每种方法都可以帮助在某些几何形状和光照情况下匹配采样率,而在另一些情况下则会降低采样率。Lloyd 等人 [1062,1063]分析了PSM,TSM 和 LiSPSM之间的等效性,从而很好地概述了这些方法的采样和走样问题。当光线的方向垂直于视图的方向(例如头顶)时,这些方案最有效,因为可以移动透视变换以使更多的样本更靠近眼睛。

图7.17. 对于顶灯,左边的地板上的采样与眼睛的比率不匹配。通过更改右侧的光线的观看方向和投影窗口,采样率将偏向于具有更高密度的像素,使其更接近眼睛(?)

 

矩阵扭曲技术无法提供帮助的一种照明情况是,当光线在相机前面并指向相机时。这种情况被称为视锥决斗(dueling frusta),或更通俗地说是“顶灯下的鹿”(?)。要接近眼睛的感觉,需要更多阴影贴图样本,但是线性扭曲只会使情况变得更糟 [1555]。这个问题和其他一些问题,例如画面质量的突然变化 [430] 和相机运动过程中产生的阴影的“紧张”,不稳定的质量 [484,1227],使这些方法不受欢迎。

在观看者所在的位置添加更多样本的想法是一个不错的主意,导致产生针对给定视图生成多个阴影贴图的算法。当 Carmack 在 2004 年 Quakecon 的主题演讲中描述这一想法时,它首先产生了显着的影响。Blow 独立地实现了这种系统 [174]。这个想法很简单:生成一组固定的阴影贴图(可能以不同的分辨率),覆盖场景的不同区域。在 Blow 的方案中,在观察者周围嵌套了四个阴影贴图。这样,高分辨率地图可用于附近的对象,而远处的那些对象的分辨率会下降。Forsyth [483,486] 提出了一个相关的想法,为不同的可见对象集生成不同的阴影贴图。在他的设置中避免了如何处理跨两个阴影贴图之间的边界的对象的过渡问题,因为每个对象都有一个且只有一个阴影图与之关联。旗舰工作室(Flagship Studios)开发了一种融合了这两种想法的系统。一个阴影贴图用于附近的动态对象,另一个阴影贴图用于观察者附近的静态对象的网格区域,第三阴影贴图用于整个场景中的静态对象。第一个阴影贴图按逐帧来生成。由于光源和几何形状是静态的,因此其他两个阴影贴图只能生成一次。尽管所有这些特定系统现在都已经很老了,但是针对不同对象和情况的多个映射(有些是预先计算的,有些是动态的)的思想是此后开发的算法中的一个共同主题。

2006年,Engel [430],Lloyd 等人 [1062,1063],和 Zhang 等。[1962,1963] 独立研究了相同的基本概念。(1) 这个概念是将视锥体平行于视线方向切成几部分。见图 7.18。随着深度的增加,每个连续的视锥体的深度范围大约是先前体积的深度范围的两到三倍 [430,1962]。对于每个视锥体,光源都可以形成一个将视锥体紧紧包围的视锥,然后生成阴影贴图。通过使用纹理地图集或阵列,可以将不同的阴影贴图视为一个大型纹理对象,从而最大程度地减少了缓存访问延迟。图 7.19 显示了获得的质量改进的比较。Engel 将此算法称为层级阴影贴图(cascaded shadow maps,CSM),比 Zhang 的术语平行分割阴影贴图(parallel-split shadow maps)更常用,但两者都出现在文献中并且实际上是相同的 [1964]

这种类型的算法易于实现,可以覆盖较大的场景区域并具有合理的结果,并且功能强大。可以通过以更高的速度靠近眼睛来采样并解决视锥问题,并且没有严重的最坏情况问题。由于这些优点,在许多应用程序中使用了层级阴影贴图。

图7.18.  在左侧,从视线看到的视锥体被分成四个部分。在右侧,为视锥体创建了边界框,该边界框确定了方向光条件下四个阴影贴图中对应渲染的视锥体。(在 Engel [430]之后。)

图7.19.  在左侧,场景的可视范围广,导致单个 2048 × 2048 分辨率的阴影贴图具有透视锯齿。在右边,沿视轴放置的四个1024 × 1024 阴影贴图可显着提高质量 [1963]。栅栏前方的缩放显示红色框中。(图片由香港中文大学的张凡提供。)

图7.20.  阴影层级可视化。紫色,绿色,黄色和红色表示最近到最远的层级。(图片由Unity Technologies提供。)

 

虽然可以使用透视变形将更多样本打包到单个阴影贴图的细分区域中 [1783],但为了规范,每个层级会使用单独的阴影贴图。如图 7.18 所示,图 7.20 从观察者的角度显示,每张地图所覆盖的区域可以变化。较小的阴影贴图的较小视锥体在需要的地方提供了更多样本。确定如何在地图之间划分 z 深度的范围(称为 z 分区任务)可能非常简单,也可能复杂难懂 [412,991,1791]。一种方法是对数分区(logarithmic partitioning)[1062],其中每个层级图的远近平面距离之比都相同:

其中,n 和 f 是整个场景的近平面和远平面,c 是地图的数量,r 是结果比率。例如,如果场景的最近对象是 1 米远,最大距离是1000米,并且我们有三个层级贴图,则  最近视图的近平面距离和远平面距离将是 1 和 10,则下一个间隔为 10 到 100 ,以保持该比例,最后一个间隔为 100 到 1000 米。初始近平面深度对该分区影响很大。如果近平面深度只有 0.1 米,则 10000 的立方根为 21.54,这是一个相当高的比率,例如 0.1 到 2.154 到 46.42 到 1000。这意味着生成的每个阴影贴图必须覆盖更大的区域,从而降低了其精度 。在实践中,这样的划分为靠近近平面的区域提供了相当大的分辨率,如果该区域中没有任何对象,这将被浪费。避免这种资源不匹配的一种方法是将分区距离设置为对数分布和等距分布的加权混合 [1962,1963],但是如果我们可以确定场景的紧密视域(tight view bounds),那么会更好。

此方法的挑战在于设置近平面。如果距离眼睛太远,则该平面可能会将物体裁剪,这是非常糟糕的伪像。对于剪辑场景,美术人员可以预先精确设置此值 [1590],但是对于交互式环境,此问题更具挑战性。Lauritzen 等人[991,1403] 提出了样本分布阴影贴图(sample distribution shadow maps,SDSM),它使用前一帧的 z 深度值,并通过两种方法之一来确定更好的分区。

第一种方法是查看 z 深度的最小值和最大值,并使用它们来设置近平面和远平面。这是通过在 GPU 上执行 reduce 操作来执行的,在该操作中,将会计算或者其他着色器将分析一系列越来越小的缓冲区,并将输出缓冲区作为输入进行反馈,直到剩下 1 × 1 缓冲区为止。通常,会将这些值往外推出一点以调整场景中对象移动的速度。除非采取纠正措施,否则从屏幕边缘进入的附近物体仍可能会导致帧问题,尽管在下一帧中将很快得到纠正。

第二种方法还分析了深度缓冲区的值,制作了一个称为直方图(histogram)的图表,该图表记录了 z 深度沿范围的分布。除了找到紧密的近平面和远平面之外,在根本没有对象的位置,图形中可能会有空隙。通常添加到该区域的任何分区平面都可以捕捉到实际存在对象的位置,从而为层级贴图集提供更高的 z 深度精度。

在实践中,第一种方法是通用的,且快速的(通常在每帧1 ms范围内),并且效果良好,因此已在多种应用中被采用 [1405,1811]。见图7.21。

图7.21. 深度范围的影响。在左侧,未使用特殊处理来调整近平面和远平面。在右侧,SDSM用于查找更严格的边界。请注意每个图像左边缘附近的窗框,二楼花箱下方的区域以及一楼的窗户,由于松散的视野范围而导致的欠采样会导致伪像。可以用指数阴影贴图去渲染这些特定图像,但是提高深度精度的想法对于所有阴影贴图技术都是有用的。(图片由 Dawn Studios 的 Ready 提供,版权为 Sony Interactive Entertainment。)

 

与单个阴影贴图一样,由于光照样本逐帧移动而造成的闪烁伪像是一个问题,并且还会随着对象在层级之间移动而变得更糟。可以使用多种方法来维护世界空间中的稳定采样点,每种方法都有自己的优势 [41,865,1381,1403,1678,1679,1810]。当对象跨越两个阴影贴图之间的边界时,阴影质量可能会突然发生变化。一种解决方案是使视锥体稍微重叠。在这些重叠区域中获取的样本从两个相邻的阴影贴图中收集结果并进行混合 [1791]。或者,可以通过使用抖动 [1381]在这样的区域中采集单个样本。

由于它的流行,人们已经投入了大量的精力来提高其效率和质量 [1791,1964]。如果阴影贴图的视锥体内部没有任何变化,则无需重新计算该阴影贴图。对于每种光线,可以通过找到哪些对象对光线可见以及其中哪些可以在接收器上投射阴影来预先计算阴影投射器列表 [1405]。由于很难理解阴影是否正确,因此可以采用一些适用于层级和其他算法的快捷方法。一种技术是使用低级别的细节模型作为替代来进行实际的投射阴影 [652,1812]。另一个方法是从考虑中移除小型遮挡物 [1381,1811]。从理论上来说,距离较远的阴影贴图的更新可以不用做到逐帧更新,因为这样的阴影不太重要。但这个办法可能会引起大的移动物体的伪像,因此需要谨慎使用 [865,1389,1391,1678,1679]。Day [329] 提出了从帧到帧“滚动”远距离贴图的想法,这种想法是每个静态阴影贴图的大部分都是可在帧与帧之间重用的,并且只有条纹可能会改变(?),因此需要渲染。DOOM(2016)等游戏维护着大量的阴影贴图集,但仅重新生成对象移动的那些贴图 [294]。更远的层级阴影贴图可以设置为完全忽略动态对象,因为这样的阴影可能对场景的贡献很小。在某些环境中,可以使用高分辨率的静态阴影贴图代替这些更远的层级,从而可以显着减少工作量 [415,1590]。稀疏纹理系统(sparse texture system)(第19.10.1节)可用于单个静态阴影贴图的巨大世界 [241、625、1253]。层级阴影贴图可以与烘焙的光照贴图纹理或其他更适合特定情况的阴影技术结合使用 [652]。Valient的演讲 [1811] 值得注意,因为它描述了针对各种视频游戏的不同阴影系统的自定义设置和技术。第 11.5.1 节详细讨论了预先计算的光和阴影算法。

创建多个单独的阴影贴图意味着要遍历每个几何贴图集。在一次通过将遮挡物渲染到一组阴影贴图的思路的基础上,已经建立了许多提高效率的方法。几何着色器可用于复制对象数据并将其发送到多个视图 [41]。实例化的几何着色器允许将一个对象输出到多达32个的深度纹理中 [1456]。多视口扩展可以执行诸如将对象渲染到特定纹理阵列切片(specific texture array slice) [41、154、530]之类的操作。第 21.3.1 节在将其用于虚拟现实的上下文中将对它们进行更详细的讨论。视口共享技术的可能缺点是,必须将生成的所有阴影贴图的遮挡物沿着管线发送,而不是发送与每个阴影贴图相关的集合 [1791、1810]

在现实世界里,你自己当前便处在全球数十亿光源的阴影中。并且只有其中部分光源能照到你身上。在实时渲染中,如果所有光源始终处于活动状态,则包含多个光源的大型场景可能会被海量的计算淹没。如果视锥体内部有一定空间但眼睛看不到,则不需要计算遮挡此接收器空间的对象 [625,1137]。Bittner 等人 [152]使用眼睛观察方向的遮挡剔除(第19.7节)找到所有可见的阴影接收器,然后从灯光的角度将所有潜在的阴影接收器渲染到模板缓冲蒙版。此蒙版编码从光中看到哪些可见的阴影接收器。为了生成阴影贴图,它们使用遮挡剔除从灯光中渲染对象,并使用遮罩将没有接收器的对象剔除。各种剔除策略也可以用于照明。由于辐照度与距离的平方成正比,因此一种常见的技术是在某个阈值距离之后选择光源。例如,第 19.5 节中的入口剔除技术(portal culling technique)可以发现哪些光线会影响哪些单元。这是一个活跃的研究领域,因为其性能优势十分可观 [1330,1604]

 

7.5 百分比渐近滤波 Percentage-Closer Filtering

阴影贴图技术的简单扩展可以提供伪软阴影(pseudo-soft shadows)。此方法还可帮助改善分辨率问题,当单个光照样本单元覆盖许多屏幕像素时,这些问题会导致阴影看起来呈现块状。该解决方案类似于纹理放大(第6.2.1节)。但不同的是会获取四个最接近的样本,而不是从阴影贴图中获取一个样本。该技术不会在深度本身之间进行插值,而是将其与表面深度进行比较并得出结果。也就是说,将表面的深度分别与四个纹理像素深度进行比较,然后针对每个阴影贴图样本确定该点在光还是阴影下。然后对这些结果(即阴影的 0 和光的 1)进行双线性插值,以计算实际上对表面位置有多少贡献的光。这种滤波会产生人为的柔和阴影。这些半影的变化取决于阴影贴图的分辨率,相机位置和其他因素。例如,较高的分辨率可使边缘的柔化范围更窄。不过,有半影和平滑总比没有要好。

从阴影贴图中检索多个样本并混合结果的做法称为百分比渐近滤波(percentage-closer filtering,PCF)[1475]。区域光产生柔和的阴影。到达表面上某个位置的光量取决于该位置可见的光区域的比例。PCF 试图通过逆过程来近似精确光(或方向光)的柔和阴影。它不是从某个表面位置找到该光的可见区域,而是从原始位置附近的一组表面位置中找到了点光源的可见性。见图7.22。名称“百分比渐近滤波”是指最终目标,即查找可见光所取样品的百分比。该百分比是然后用于遮蔽表面的光量。

图7.22. 在左侧,区域光源的棕色线段表示形成半影的位置。对于接收器上的单个点 p,可以通过在区域光的表面上测试一组点并找出没有被任何遮挡物阻挡的点来计算接收到的照明量。在右侧,点光源不会投射半影。PCF 通过逆过程来近似区域光的效果:在给定位置,它将在阴影贴图的可比较区域上采样,以得出照亮多少个样本的百分比。红色椭圆表示阴影贴图上采样的区域。理想情况下,该磁盘的宽度与接收器和遮挡器之间的距离成比例。

 

在 PCF 中,会在大约相同的深度,但在阴影贴图上的不同纹理位置上的曲面附近生成位置信息。接下来检查每个位置的可见性,然后将这些生成的布尔值(激活或未激活)混合在一起,以获得柔和的阴影。请注意,此过程是非物理的:此过程不是直接对光源进行采样,而是依赖于对表面本身进行采样的想法。到遮挡物的距离不会影响结果,因此阴影具有类似遮挡物大小的半影。尽管如此,该方法在许多情况下仍可提供合理的近似值。

一旦确定了要采样区域的宽度,以避免走样及伪像的方式进行采样就很重要。如何对附近的阴影贴图位置进行采样和滤波有多种不同的方法。这些方法包括要采样的区域的范围,要使用的样本数,采样模式以及如何加权结果。使用功能较差的 API,可以通过类似于双线性插值的特殊纹理采样模式来加速采样过程,该模式可以访问四个相邻位置。而不是混合结果,而是将四个样本中的每个样本与给定值进行比较,然后返回通过测试的比率 [175]。然而,以规则的网格图案执行最近邻采样会产生明显的伪像。使用使结果模糊但尊重对象边缘的联合双边滤波器可以提高质量,同时避免阴影泄漏到其他表面上 [1343]。有关此过滤技术的更多信息,请参见第 12.1.1 节。

DirectX 10 引入了对 PCF 的单指令双线性滤波的支持,从而提供了更为平滑的结果 [53、412、1709、1790]。与最近邻采样相比,这提供了可观的视觉改进,但是来自常规采样的伪像仍然是一个问题。最小化网格图案的一种解决方案是使用预先计算的泊松分布图案对区域进行采样,如图 7.23 所示。这种分布将样本分散开,以使它们既不彼此靠近也不规则。众所周知,对于每个像素使用相同的采样位置,无论其分布如何,都可能会产生图案 [288]。可以通过围绕样本中心随机旋转样本分布来避免此类伪像,从而将走样化为噪声。Casta No [235] 发现,泊松采样产生的噪声因其平滑,风格化的内容而特别引人注目。他提出了一种基于双线性采样的高效高斯加权采样方案。

图7.23.  最左端显示使用最近邻采样的 4×4 网格模式的 PCF 采样。最右边显示磁盘上的 12 抽头(?)泊松采样模式。使用此模式对阴影贴图进行采样可在第二张图提供改进的结果,尽管仍然可以看到伪像。在第三张图,采样模式在像素之间围绕其中心随机旋转。结构化的阴影伪像会变成(几乎不令人反感的)噪音。(图片由ATI Research,Inc.的John Isidoro提供)

 

自阴影问题和漏光(例如痤疮和 Peter Panning)在 PCF 中可能变得更糟。斜率比例偏差(Slope scale bias)基于样本与阴影的角度,只是根据其与光线的角度将表面推离光线。通过从表面上的单个位置在更大的区域中采样,某些测试样本可能会被真实的表面所阻塞。

一些不同的附加偏差值可以被成功地用来减少自阴影的风险。Burley [212] 描述了偏差锥(bias cone),其中每个样本都朝着与光到原始样本的距离成正比的方向移动。Burley 建议斜率为 2.0,同时具有较小的恒定偏差。参见图 7.24。

图7.24. 附加阴影偏差方法。对于PCF,在原始样品位置(五个点的中心)周围采集了几个样本。所有这些样本都应激活。在左图中,形成了一个偏差锥,样本被向上移动。可以增加圆锥的陡度,以将右侧的样本拉到足够近的距离以进行照明,从而冒着其他地方(未显示)的其他样本的光漏现象增加的风险,这些其他样本确实被遮挡了。在中间的图中,所有样本都被调整为位于接收器的平面上。这对于凸面效果很好,但在凹面上可能适得其反,如左侧所示。在右图中,法线偏移偏差方法使样本沿着曲面的法线方向移动,与法线和灯光之间的角度的正弦成正比。对于中心样本,这可以认为是移动到原始表面上方的虚构表面。该偏差不仅会影响深度,还会更改用于测试阴影贴图的纹理坐标。

 

Schüuler [1585],Isidoro [804] 和 Tuft [1790] 提出了基于观察得到的技术,即接收器本身的斜率应用于调整其余样本的深度。在这三者中,塔夫特的公式 [1790] 最容易应用于层级阴影贴图。Dou 等人[373] 进一步完善和扩展了这个概念,考虑了 z 深度如何以非线性方式变化。这些方法假定附近的样本位置在三角形所形成的同一平面上。称为接收器平面深度偏差(receiver plane depth bias)或其他类似术语,由于在此假想平面上的位置确实在表面上,或者如果模型是凸面,则在该表面的前面,此技术在很多情况下都可以非常精确。如图 7.24 所示,凹面附近的样本可能会被隐藏。常量,斜率比例尺,接收器平面,视线偏移和法线偏移的组合已用于解决自阴影问题,尽管这仍然需要针对每种环境进行手动调整 [235,1391,1403]

PCF 的一个问题是,由于采样区域的宽度保持不变,因此阴影将显示出均匀柔和的阴影,且阴影的宽度相同。在某些情况下,这是可以接受的,但在封堵器和接收器之间有地面接触的地方,这似乎是不正确的。见图 7.25。

 

7.6 百分比渐近软阴影 Percentage-Closer Soft Shadows

在 2005 年,Fernando [212,467,1252] 发表了一种有影响力的方法,称为“百分比渐近软阴影(Percentage-Closer Soft Shadows,PCSS)”。它通过在阴影图上搜索附近区域以找到所有可能的遮挡物来尝试解决软阴影问题。这些遮挡器与位置的平均距离用于确定样本区域的宽度:

其中 d_{r}  是接收器与光线的距离,并计算平均的遮挡物距离。换句话说,样本的表面积的宽度随着平均的遮挡物离接收器的距离越来越远、离光越来越近而增加。请查看图 7.22,并思考移动遮挡物的效果,看看这是如何发生的。图 7.2(第224页),7.25 和 7.26 显示了示例。

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

该方法的缺点是需要对阴影图的适当大小的区域进行采样才能找到遮挡物。使用旋转的泊松磁盘图案可以帮助隐藏欠采样的伪像 [865,1590]。Jimenez [832] 注意到泊松采样在运动中可能会不稳定,并发现通过使用抖动和随机之间的中间函数形成的螺旋模式可以在帧与帧之间提供更好的结果。

Sikachev 等人 [1641] 详细讨论了使用 SM 5.0 中功能的 PCSS 的更快实现,该功能由 AMD 引入,并经常以接触硬化阴影(contact hardening shadows,CHS)的名称来称呼。这个新方法还解决了基本 PCSS 的另一个问题:半影的大小受阴影贴图分辨率的影响。见图 7.25。通过最先生成阴影贴图的 mipmap,然后选择最接近用户定义的世界空间内核大小的 mip 级别,可以将此问题最小化。采样一个 8×8 的区域以查找平均阻塞深度,仅需要16个GatherRed()函数的纹理调用。一旦找到预估的半影,则将较高分辨率的 mip 级别用于阴影的锐利区域,而将较低分辨率的 mip 级别用于较柔和的区域。

CHS 已用于许多视频游戏中 [1351、1590、1641、1678、1679],并且研究仍在继续。例如,Buades 等人 [206] 提出了可分离的软阴影贴图(separable soft shadow mapping,SSSM),其中对网格采样的 PCSS 过程被分成可分离的部分,并且像素之间尽可能地重用元素。

事实证明,对于加速每个像素需要多个样本的算法有帮助的概念是分层的最小/最大阴影贴图(min/max shadow map)。虽然通常无法对阴影贴图的深度进行平均,但每个 mipmap 级别的最小值和最大值可能会很有用。也就是说,可以形成两个 mipmap,一个保存在每个区域中找到的最大 z-depth(有时称为HiZ),另一个保存最小的 z-depth。给定要采样的纹理像素位置,深度和面积,可以使用 mipmap 快速确定完全光照和完全阴影的条件。例如,如果纹理像素的 z 深度大于为 mipmap 的相应区域存储的最大 z 深度,则该纹理像素必须处于阴影状态-不需要其他样本。这种类型的阴影图使精确光可见性的任务更加有效 [357、415、610、680、1064、1811]

PCF 等方法通过对附近的接收器位置进行采样来工作。PCSS 通过查找附近遮挡器的平均深度来工作。这些算法没有直接考虑光源的面积,而是对附近的表面进行采样,并且受阴影贴图分辨率的影响。PCSS 理论背后的一个主要假设是,平均阻塞物(blocker)是对半影大小的合理估计(?)。当两个遮挡物(例如路灯和远处的山脉)部分遮挡同一像素的同一表面时,此假设将被破坏并可能导致伪像。理想情况下,我们要确定从单个接收器位置可见多少区域光源。一些研究人员已经使用 GPU 探索了反投影(backprojection)。这个想法是将每个接收器的位置视为一个视点,并将区域光源视为一个视平面,并将遮挡物投射到该平面上。Schwarz and Stamminger [1593] 和 Guennebaud 等人 [617] 总结了以前的工作并提供了自己的改进。Bavoil等人 [116] 采用另一种方法,使用深度剥离创建多层阴影贴图。反投影算法可以提供出色的结果,但是(到目前为止)较高的逐像素成本意味着它们尚未在交互式应用程序中得到采用。

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. vmware虚拟机桥接模式无法上网

    情况说明:我的虚拟机在桥接模式下只能ping通本地机器,ping不同www.baidu.com。尝试了诸多方法,终于成功了。 方法:为虚拟机安装一个网卡,将当前上网的网卡的网络分享给刚刚安装的网卡。 1.安装网卡 我的电脑--管理--设…...

    2024/4/9 4:29:47
  2. 次世代游戏角色建模,如何学好人体和五官的雕刻?

    在做次世代游戏角色建模的时候掌握人体肌肉组成和形体比例是至关重要的。 因为不管是用ZBrush、Maya还是3DMax,或者其他的3D建模软件,只要是关于人物建模、角色建模的,都需要了解人体比例和肌肉骨骼。 这些参考图在平时练习时参考学习都是很…...

    2024/4/9 4:29:46
  3. 论文阅读——Effificient Multiple Organ Localization in CT Image Using 3D Region Proposal Network

    论文【Effificient Multiple Organ Localization in CT Image Using 3D Region Proposal Network】 前几年的CT图像器官检测中的深度学习方法常用2D slices,比如利用冠状面、矢状面、横断面的CT slices训练3个独立的2D网络,通过3个预测B-box确定器官的形…...

    2024/4/9 4:29:45
  4. 浩辰CAD 2021:深度升级,全面提升用户体验!

    在全球新冠疫情背景下,全球经济发展速度明显减缓,国内国外的市场竞争更加激烈,各企业对于提升数字化、网络化、智能化发展水平的需求也愈发迫切。这就需要企业配备更加全面和系统化的数字化设计平台,提高创新研发能力和市场竞争力…...

    2024/4/17 4:56:41
  5. OSI七层参考模型和TCP/IP协议族

    七层参考模型分层思想七层参考模型什么是开放系统互连(OSI)参考模型?七层参考模型及其功能分层模型各层对应的设备OSI模型vsTCP/IP模型TCP/IP协议族的组成分层思想 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c…...

    2024/4/9 4:29:43
  6. 莫比乌斯函数学习笔记

    莫比乌斯函数学习笔记 莫比乌斯环是非常重要的 莫比乌斯函数是数论中重要内容,所以搞懂它很重要!!! 定义 设 x∏i1cpikix\prod\limits_{i1}^c p_i^{k_i}xi1∏c​piki​​,其中 pip_ipi​ 为质数。 μ(x){1x1(−1)c…...

    2024/4/9 4:29:43
  7. 今年的比特币价格将会达到25000美元 ! 比特币矿工在枯水期赶紧囤币等待爆发?

    最近去中心化金融(DeFi)的爆炸性增长使该行业在不到五个月的时间内锁定了价值近40亿美元的比特币和以太坊。 根据DeFi Pulse的数据,自6月以来,锁定在DeFi协议中的以太币数量增加了218.5%,从270万ETH增长到8…...

    2024/4/9 4:29:41
  8. Postman在pre-request Script中执行登录获取token

    Postman在pre-request Script中执行登录获取token 1.问题是什么 执行接口需要每次执行登录,然后带入登录的token,需要复制比较麻烦 2.怎么解决 把每次请求发送之前先发送登录请求,然后把登录的token设置到环境变量,最后再把取环境变量的值t…...

    2024/4/9 4:29:40
  9. C语言指针笔记

    一元运算符&用于取一个对象的地址 p &c 将C的地址赋值给变量p,我们称p为“指向”c的指针。 一元运算符是间接寻址或间接引用运算符运算符。当他作用于指针时,将访问指针所指向的对象。 (ps:这才是正确的,不是其他书上的…...

    2024/4/9 4:29:39
  10. setup和setup_class区别

    setup和setup_class区别 1.用例级别的初始化每个用例前去执行setup 2.用例级别的初始化每个用例后去执行tearDown 3.所有用例前执行setup_class 4.所有用例执行后执行一次teardown_class...

    2024/4/9 3:52:43
  11. 1049 Counting Ones(简单数学)

    题目描述如下: 题目大致意思: 题目理解起来很简单,给出一个正整数,求出从1到该正整数中1出现的个数。 大致思路: 最简单的想法是从1到N进行遍历,累加1出现的次数即可,应该不会超出时间限制。 提…...

    2024/4/9 3:52:41
  12. layui的表单layer弹出框

    这是用到的头工具栏的新增数据 //头工具栏事件table.on(toolbar(saleChances), function(obj){var checkStatus table.checkStatus(obj.config.id);console.log(checkStatus)switch(obj.event){case add:openAdd();// window.location.href ctx /sale_chance/addOrUpdateSa…...

    2024/4/9 3:52:40
  13. 电视剧的制作和发行

    一、制作许可证号(打在片尾) 开机拍摄前应取得制作许可证号,发行前应全剧完整送审以取得发行许可证号。 二、发行许可证号(打在片头) 发行许可证又分三类: 1.国家新闻出版广电总局负责向总局直接备案中…...

    2024/4/9 3:52:39
  14. 推荐算法-简介

    1. 什么是推荐算法 推荐算法最早在1992年就提出来了,但是火起来实际上是最近这些年的事情,因为互联网的爆发,有了更大的数据量可以供我们使用,推荐算法才有了很大的用武之地。 最开始,所以我们在网上找资料&#xff…...

    2024/4/14 2:46:25
  15. 健身房运营 | 除了派单,健身房高效拓客的4种方式!

    前段时间,健身圈被一则热门新闻刷了屏——舒适堡“被关门”,一兆韦德出面接盘,以成本优惠价接手舒适堡会员。图1:恶意竞争营销通知图 这个事件,给正常营业的舒适堡带来了不少负面影响,引起员工…...

    2024/4/9 4:29:37
  16. 无线温度、温湿度、气体、压力、液位变送器各自的应用场所

    随着物联网无线通讯技术的不断发展提升,传统的有线数据采集传输的方式已经逐渐改变淘汰。无线变送器作为一种无线传感网络产品,未来将逐渐取代传统有线变送器。目前,市场上应用最多的众山无线变送器主要包括无线温度变送器,无线温…...

    2024/4/9 4:29:37
  17. 8寸强固平板电脑 windows/Android系统

    8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 ​ 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 8寸强固平板电脑 01 8寸强固平板电脑 网络连接 WiFi2.4G5G双频…...

    2024/4/9 4:29:35
  18. Servlet总结

    Servlet体系结构 Servlet:接口 |(继承) GenericServlet:抽象类 |(继承) HttpServlet:抽象类 |(继承) MyServlet extends HttpServlet servlet常用方法:void init(ServletConfig config):初始化void service…...

    2024/4/12 5:04:39
  19. 面试总结-测试篇

    文章目录测试基础知识1、软件测试的含义和目的2、软件质量要求有哪些?3、测试分为几个阶段,每个阶段的测试目的是啥?4、分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试,哪个阶段最重要5、软件测试的目的&#xff…...

    2024/4/9 4:29:33
  20. 阿里云1M带宽够不够用?可以支持多少访问量

    阿里云服务器默认1M带宽够不够用呢? 1M带宽表示服务器上行带宽大小,也就是数据从服务器下载到用户客户端的速度,换算成实际下载速度是128kb/s。同一时间访问人数过多,就会出现卡顿打不开网页的情况。 1M对于个人博客、小网站来说…...

    2024/4/9 4:29:32

最新文章

  1. 读所罗门的密码笔记21_读后总结与感想兼导读

    1. 基本信息 所罗门的密码:AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字,笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …...

    2024/4/19 7:58:17
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【图论】知识点集合

    边的类型 neighbors(邻居)&#xff1a;两个顶点有一条共同边 loop&#xff1a;链接自身 link&#xff1a;两个顶点有一条边 parallel edges&#xff1a;两个顶点有两条及以上条边 无向图 必要条件&#xff1a;删掉顶点数一定大于等于剩下的顶点数 设无向图G<V,E>是…...

    2024/4/18 20:00:28
  4. Kafka架构概述

    Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…...

    2024/4/18 3:51:49
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/18 18:47:03
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/18 8:11:38
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/18 8:11:47
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/18 8:11:56
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/19 2:38:12
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/19 1:39:20
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/18 8:12:27
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/18 17:23:55
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/18 23:06:50
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/18 21:25:02
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/18 18:47:03
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/18 15:01:51
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/19 3:53:57
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/18 12:50:28
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/18 21:24:56
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/18 8:47:13
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/18 21:24:54
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/18 8:12:50
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/18 18:47:01
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/19 2:37:58
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57