【GAMES-202实时渲染】1、软阴影01(Shadow Mapping、Peter Panning、PCSS原理超详细)

软阴影(PCF、PCSS) 软阴影与硬阴影的区别如下:上面为硬阴影,下面为软阴影。PCSS ,PCF 阅读详情

1 Shadow Mapping回顾

要渲染一个点光源在场景中投射出的阴影,需要Shadow Mapping 技术

Shadow Mapping

  • 它是一个2-pass的算法
    • pass1:我们从Light处看向场景,每个像素记录它所看见的最浅深度,输出一个深度纹理图
    • pass2:从camera处看向场景,渲染一遍。拿着pass1得到的深度图,可以检测当前pass任何一个像素点是否在阴影里
  • 它是一个完全在图像空间中的算法
    • 优点:一旦shadow Map已经生成,则shadow map就可以作为场景中的几何表示(场景中所有位置在光源处的深度),而不用再去获取场景中的其他信息
    • 缺点:会产生自遮挡和走样现象.

关于渲染中提到的名词pass
1、一个pass就是走完一个渲染流程,而得到一帧数据的过程。
2、一个pass生成的纹理可以提供给之后的pass使用。
3、多个pass不同的分工,最终共同渲染出一帧图像

Shadow Mapping实现步骤

(1)从light处出发看向场景,生成一张纹理记录每个像素中最近物体深度
在这里插入图片描述
(2)我们从camera出发,渲染一遍场景。对每个像素对应的场景中的物体坐标,判断是否能被light照到,具体就是计算该着色点与光源的距离,与pass1的深度图对应像素存放的深度做对比,如果相等则不在阴影里,反之则位于阴影中。
在这里插入图片描述
Shadow Mapping的效果
有阴影的明显更加层次分明
在这里插入图片描述
注意事项

  • 我们在light处生成的是深度图(左图),而不是做着色图(右图),只需要深度信息用于pass2的阴影计算
    在这里插入图片描述

  • pass2在光栅化流程走完会生成深度图和着色图,用深度图与pass1的深度图作比较
    在这里插入图片描述

关于深度,我们在101中讨论过一个问题,在做透视投影时,先挤压后正交投影。挤压操作后,位于视锥体远近平面内的点是会被推向远处一些的。所以MVP变换之后,物体的深度是会变的,最终得到的深度并不是原本世界空间中物体到相机的距离,在做阴影映射的时候,比较两个pass的深度图时,应该做到一致性。
(1)都用投影后的z值
(2)都用实际的距离,pass1的深度图记录实际的深度,pass2用着色点投影前的坐标到光源的空间坐标的距离

至此回顾结束,下面202内容正式开始

2 Shadow Mapping缺点及解决方案

2.1 自遮挡现象

在这里插入图片描述

  • 不是摩尔纹,它是由数值精度造成的
  • 在pass1我们生成了一个深度缓存,每个像素记录它所看见的最浅深度,这个深度是一个常数,也就说对于像素覆盖区域内的场景表面的深度,我们都认为是同一个深度。我们用一个有分辨率的深度图来离散化连续场景,必然出毛病
  • 见右图,红色的切片相当于光源处深度图存放的的深度值的可视化表示,在pass1的深度图看来,物体表面被离散化成一系列红色小片,它本该是连续平面啊
  • 因此在pass2,也就是从camera处看向场景时,类似蓝色这条光路,该着色点连接光源,用这个距离与pass1存放的深度值作比较,假设存放的最近深度,在场景中表现为橙色面片,结果是着色点到光源的距离大于该值,在连续空间中本不该被遮挡的点,被我们判定为了遮挡,从而在该点产生阴影。这个现象在掠射角度时尤其严重
    在这里插入图片描述

解决方案1 定义一个bias

定义一个变量bias,值为下面黄色区域长度。定义 深度差值 小于这个值,就不算遮挡,只有大于这个值的才算遮挡

  • 当光源垂直于场景时,让bias的值小一些
  • 当光源趋于平行场景时,让bias的值大一些
  • 如何实现这个变量的动态变化?—— 方法不定,简单的可以用光线方向与法线的夹角
    在这里插入图片描述

不同于闫老师所讲的另一种理解方式

  • 黄色部分是离散后的场景,蓝色是不被误判的部分,红色是被误判为在阴影的部分,这样就会产生一道一道的黑色阴影
    在这里插入图片描述
  • 定义bias后,相当于相机击中的点不再位于真实平面上,而是把着色点向着光源的方向平移了一段bias距离。
    • 对于误判部分: 假如我们从右上角看向这个场景,位于红色误判部分的某个着色点p,因为在做判断时要向光源方向移动bias距离,因此相当于它到光源的距离变短了,短到比shadow map上记录的最小深度还要小,那么这个就不会再被阻挡
    • 非误判部分: 上图蓝色部分,被判断不在阴影里,其中着色点往光源处移动一段距离,它的深度更小了 依旧小于shadow map上记录的最小深度,所以它依然不在阴影中
  • 这样之后,入射角不大的情况下几乎不会产生自遮挡现象,但是掠射角度下依然会轻微的自遮挡
float bias = 0.005;
bool shadow = currentDepth - bias > closestDepthInShadowMap  ? true : false;

掠射角度依然自遮挡的解决办法: 根据入射光与法线的夹角,动态修改bias

float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.005);
  • 0.005是上一步定义的静态bias值,已经很不错了,但是如果夹角过大,我们需要定义更大的bias,因此用max函数

虽然解决自遮挡问题,但又引出了另一个问题:detach shadow
         \:\:\:\:\:\:\:\: 由于bias变量的存在,深度差在bias范围内的不算遮挡,不产生阴影,以至于真正的能够被场景物体遮挡的部分由于深度差并不大,也被判断为不在阴影里。这就出现了该出现阴影的地方没有阴影的情况。
在这里插入图片描述
解决方案:看这篇回答 ,总而言之还是比较麻烦的。

其实一般来说不仔细看是看不出来会有detach shadow的,比如下面这张图,你能看出来吗?放大之后,看一下其实就很小一点点。基本只要找到一个更合适的bias值 这种现象就能很好的被遮掩住。
在这里插入图片描述在这里插入图片描述


解决方案2 Second-depth shadow mapping

在Light点做pass1深度测试,不仅存最小的深度,还要存第二小的深度,然后用最小深度和第二小深度中间的深度来作比较,一共是产生了3张深度图。

  • 最浅深度图: 正常做深度测试得到的
  • 第二小深度图: 采用正面剔除(front face culling)技术,然后再正常做深度测试得到
  • 平均深度图: 前两个深度图的深度平均得到第三张图

如下图所示,假设光垂直向下照射,左1图存放最浅深度,中间图是第二深度,最终我们需要的深度图是右1图,从左到右整个鞋子的每个横轴刻度都对应了一个深度值
在这里插入图片描述

但是实际中不会使用这个技术

  • 因为需要两次深度记录,就要求场景内的物体必须都是watertight(非面片)模型,必须要有厚度,一张纸也必须做成box
  • 计算复杂,每个像素做两次深度最小的判断,最后还得取平均,实时渲染不能接受这么大的开销

实时渲染不相信复杂度,只相信绝对的速度
任何一种效果,在实时渲染中所分配到的时间,都是精确到1ms

2.2 阴影走样现象

因为深度贴图有一个固定的分辨率,多个片段对应于一个纹理像素。结果就是多个片段会从深度贴图的同一个深度值进行采样,这几个片段便得到的是同一个阴影,这就会产生锯齿边。
在这里插入图片描述

  • 工业界的解决办法是,不同位置采用不同分辨率的shadow map,或者是动态分辨率之类的技术,也可以直接用PCF生成软阴影

3 Shadow Mapping背后的数学知识

在微积分中有很多学了也不知道有什么软用的知识,类似下面这俩不等式
在这里插入图片描述
但是在实时渲染中,我们只关心近似相等,我们不考虑不等的情况,因此我们将这些不等式当约等式来使用.

实时渲染最重要的一个约等式(乘积的积分 ≈ 积分的乘积)
这个约等式的作用就是简化定积分的计算,将复杂的被积函数拆开,分别计算积分值,并且结果还能近似相等
在这里插入图片描述

  • 为什么右边第一个函数多了个分母?—— 为了保证左右能量相等而做的类似归一化的操作
    我们假设f(x)是一个常值函数f(x) = 2,我们的积分域为一维的(0-3),那么约等式左边,把f(x) = 2代入,则可以提出来变为2倍的g(x)积分,而等式右侧第一个函数代入f(x)的积分是2 * 3 =6,分母的积分是3,结果也正好是2.正好也是2倍的g(x)积分。

  • 什么情况下约等式结果更加准确? —— 满足以下两个条件之一

    • g(x)的实际积分域足够小(比如一个半球上,实际积分域为若干倍单位立体角,足够小了吧- -)
    • g(x)在积分域上足够光滑(并不是函数曲线光滑,而是函数最值差距小)

很快啊,这个约等式就能应用到渲染方程中

  • 首先在实时渲染中的渲染方程略微不同

    • brdf在RTR中,我们把cosine也直接包含进去
    • Visibility是在实时渲染中我们需要考虑到物体会不会被光源照射到,比如在一点p往一个方向去看,我们知道这一方向有光源发出光线的,引入Visibility 的概念,描述光线能否打到p上,即任何一个shading point往ωi方向去看,能否看见光源。这么理解是为了能够更好理解环境光照,要比不写visilibity项更加直观。
    • 任何方向过来的光的强度由一张图来决定,可以一个是cube box也可以是定义在球上的一张图,这两种表示都有不同的问题,在本课中会介绍一种新的以八面体来表示的方法
      在这里插入图片描述
  • 我们把visibility项V(p, ωi) 看作是f(x),应用约等式,并且不要忘了归一化
    在这里插入图片描述

  • 最终结果:红色区域部分是可见性,另外一边就是shading的结果。这也正是Shadow Mapping的思想(2pass渲染,这里相当于先进行着色点渲染,之后再把Visibility乘上去即可)

什么时候这个约等式比较准确? —— 前面说过,满足两个条件之一

  • 条件一:我们要控制积分域足够小,也就是说我们只有一个点光源或者方向光源
  • 条件二:g(x)足够平缓,也就是右边积分区域内的函数最值差距小。Li是光源Radiance,是常数,那只能是BRDF项变化足够小,啥时候小?漫反射BRDF

因此很多论文通常会说,本论文的shadow mapping方法在glossy环境时不准确(因为glossy材质的BRDF并不“光滑”)

4 软阴影生成技术 PCSS(Percentage Closer Soft Shadows)

PCSS不是在面光源的基础上生成软阴影,光源依然是点光源,只是模拟面光源的软阴影
在这里插入图片描述在这里插入图片描述
软阴影和硬阴影的区别在于有没有明显的边界

软阴影现象很形象的例子,在GAMES101的课程中提过,这里复习一下
Umbra区域(阴影),太阳完全被月亮遮挡
Penumbra区域(半阴影),太阳被部分遮挡
在这里插入图片描述

4.1 Percentage Closer Filtering(PCF)

PCF是一个工具,这个工具最早是用来做抗锯齿的

把PCF工具用来生成软阴影,这种技术就被称作PCSS (Percentage Closer Soft Shadows)

  • PCF不是直接在最后生成的结果上做模糊,如忍者那张图的阴影,并不是在他的基础上去进行模糊处理,而是在你做阴影判断时进行filtering操作,然后再生成阴影。类比与之前光栅化的反走样操作,不是在已经生成的有锯齿的图像上做模糊,而是先对信号高频段进行模糊,后抗锯齿
  • PCF也不是对光源处做的pass1得到的shadow map进行filtring,深度图是那种黑白色深浅不一的图,这张图也有比较锐利的边界,我们并不是对这张深度图应用什么低通滤波,这是没有用的,因为就算在这里对深度图做模糊,得到模糊的深度图,最后我在pass2对每个着色点进行判断的时候依然是用着色点到光源的距离跟深度图作比较,非0即1,得到的依然是硬得不得了的阴影

PCF具体的做法

  • 我们之前在做点是否在阴影中时,把shading point连向light然后跟Shadow map对应的这一点深度比较判断是否在阴影内,之前我们是做一次比较。

  • 这里的区别是,对于这个shading point我们仍要判断是否在阴影内,但是我们把其投影到light之后不再只找其对应的单个像素,而是找其周围一圈的像素,把周围像素深度比较的结果加起来平均一下,就得到一个0-1之间的数,就得到了一个模糊的结果。

  • 如图,蓝点是本来应该找的单个像素,现在我们对其周围3x3个像素的范围进行比较,由于是在Shadow map上,因此每个像素都代表一个深度,我们让在shadow map上范围内的每个像素都与shading point的实际深度进行一下比较,如果shadow map上范围内的像素深度小于shading point的实际深度,则输出1,否则输出0.
    在这里插入图片描述

  • 最终得到的结果是3x3个01,算出这9个数的平均值0.667作为shading point的可见性。在计算阴影的时候我们就拿这个作系数来绘制阴影。也可以加权平均,权值分布可以是越靠近中间的深度值越高。
    所以再次强调:PCSS不是对深度图做模糊,也不是对最后已经生成好的阴影做模糊,而是NxN个比较结果做模糊
    在这里插入图片描述

抗锯齿效果对比
在这里插入图片描述
在这里插入图片描述

这个技术十分耗费性能,本来硬阴影每个着色点会比较1次深度,但是软阴影的生成要比较的次数就是几十上百次

选择filter size 的不同有什么影响?—— filter size取得越大,阴影就越软
那么回顾一下,软阴影到底怎么来的,就是在硬阴影的深度比较的时候,选择一个大的filtering。
如果取1x1的就还是硬阴影。

提出问题:

  • 可不可以先生成一个硬阴影,在阴影的不同位置上给不同filtering,从而制造软阴影呢?
  • 如果在硬阴影每个着色点都取一样的filter,和取不同的filter,会有什么不一样么?

看下面一个例子

  • 可以看见,笔尖的阴影十分锐利,而笔杆的阴影会软一些
  • 现实中阴影产生的规律:
    • 承载阴影的物体表面点与阴影产生物的距离越小,阴影越硬。
    • 阴影的软硬与光源距离无关,与遮挡物距离有关

在这里插入图片描述


此时一个关键思想出现:Filter size <=> blocker distance

下图很经典,右上角是一块面光源(2维下为一条线段),中间的Blocker是一个点,左下角WPenumbra为照射产生的半影区域,即软阴影长度。如果光源换成点光源,很明显往Blocker方向去的光会在Receiver上产生一个点的硬阴影,而不是一块半影区域
在这里插入图片描述
如果我们将blocker点的位置移动一下,比如越靠近receiver,我们会发现WPenumbra区域也就会越小,反之越大,而W的大小就反应了软阴影软的程度。

这里根据相似三角形可以推出一个公式:

W P e n u m b r a W L i g h t = d R e c e i v e r − d B l o c k e r d B l o c k e r \displaystyle\Large \frac{W_{Penumbra}}{W_{Light}} = \frac{d_{Receiver} - d_{Blocker}}{d_{Blocker}} WLight​WPenumbra​​=dBlocker​dReceiver​−dBlocker​​ W P e n u m b r a = ( d R e c e i v e r − d B l o c k e r ) × W L i g h t d B l o c k e r \displaystyle\Large W_{Penumbra} = \frac{(d_{Receiver} - d_{Blocker}) \times W_{Light}}{d_{Blocker}} WPenumbra​=dBlocker​(dReceiver​−dBlocker​)×WLight​​

  • WPenumbra:软阴影面积
  • WLight:阴影面积
  • dReceiver:光源到Receiver的距离
  • dBlocker:光源到Blocker的距离

PCF时,用到的filter区域的大小取决于Blocker到Receiver的距离(和光源大小),所以就有filter size <=> blocker distance


我们想要计算遮挡物到阴影接收物的距离,需要先得到 遮挡物与光源的距离,
即下面的Blocker search

4.2 完整的PCSS算法步骤

  • (1) Blocker search:获得某块区域遮挡物的平均深度(Average Blocker Depth)
    某个着色点连向光源,找到shadow map上该像素周围一块区域的纹素所记录的深度值,把区域所有texel都找一遍,判断是不是遮挡物,如果是遮挡物,则累加,最后除以遮挡物的个数,以这个平均值作为遮挡物的深度即上面的 d b l o c k e r d_{blocker} dblocker​。
  • (2) Penumbra estimation:利用遮挡物平均深度计算filter size
    计算遮挡物平均深度后,套用公式 W P e n u m b r a = ( d R e c e i v e r − d B l o c k e r ) × W L i g h t d B l o c k e r \displaystyle\large W_{Penumbra} = \frac{(d_{Receiver} - d_{Blocker}) \times W_{Light}}{d_{Blocker}} WPenumbra​=dBlocker​(dReceiver​−dBlocker​)×WLight​​,根据计算出来的W确定filtering size,这个size如何确定因人而异
  • (3) Percentage Closer Filtering
    根据第二步计算出来的size,选 n × n n \times n n×n个像素的深度一个个的与着色点深度(着色点到光源)进行比较,得到一个01矩阵。对矩阵做平均,得到[0,1]的值,这个值就是阴影软硬的一个系数

补充:遮挡物的平均深度
比如着色点深度为7,shadow map上对应一个5x5区域存的深度如下
在这里插入图片描述
我们要计算的平均深度是蓝色区域,因为红色部分深度都>7,不是遮挡物。


前面说了最后一个问题了,这里还有最最最后的一个问题

为了做PCF,我们需要知道第二步中的filter size大小。为了知道filter size大小,我们还需要知道第一步某块特定区域到底选多大,那这块特定区域又怎么选呢- -?

  • 法1:就是自己规定一个,比如16 x 16,简单但是不太妙
  • 法2:根据光源大小确定这块区域大小(虽然我们用的点光源,但可以定义一个虚拟的面光源尺寸)
    如下图shadow map其实就是在light为原点的近平面上记录着的,我们可以在空间中,把着色点连接到light的端点处,看连线所围成的这个棱锥体在近平面覆盖多少区域,就用这个区域计算平均深度。这是很对的思想,因为理论上只有这个棱锥内部的物体才有可能挡住着色点
    • 着色点离光源越远,Shadow map上区域就更小
    • 离光源越近,在Shadow map上的区域就更大
      在这里插入图片描述

开销极其恐怖,却又广泛应用于实时渲染的软阴影生成中,怎么办到的?在202第四堂课中介绍

总结三步PCSS

  • 寻找blocker(shadow map上的一块区域大小),并计算遮挡物平均深度
  • 计算filter size
  • 按照PCF方式绘制软阴影

这块知识确实很难理解,反复看视频,几百个字写了好几个小时。可能要等到写过具体代码才能验证自己的理解是否正确,希望看到这篇笔记的人,能有自己的正误判断,如果我理解有错也欢迎评论指出一下,谢谢了。


部分课堂问题:

  • 问题1:多个光源Shadow Mapping怎么做?
    答:很不好处理,n个光源就需要计算n张shadow map,因此速度会降低到原本的 1 n \frac{1}{n} n1​
基于CSM和PCF的软阴影实现 断断续续花了两个多礼拜才把这个问题完全搞定,比开始预想的时间多多了,一开始也没想到会碰到这么多的状况,不过好在是都解决了。阴影技术是三维渲染里面的一个非常重要的课题,实现方式多种多样,最基本的是从光源方向渲一张ShadowMap,简单易行,但是效果很差,锯齿像牛一样大。想要获得更精细的阴影,唯一的办法就是加大SM的分辨率。 事实上我们对远处的阴影要求并没有近处那么高,粗糙点无所谓,反正离得远也 阅读详情

相关推荐

解读unity内置的软阴影处理方式

这里的_ShadowMapTexture_TexelSize的x、y、z、w分量分别是阴影贴图的水平像素个数倒数,垂直像素个数倒数,水平像素个数,垂直像素个数。而又因为是相邻每两个像素的归一化,所以绿色框住的起点是-1.5+2=0.5,于是得到上面的偏移:+float2(-1.5,0.5);得到一个点的权重,然后分别做四次即可,得到四个方向上的阴影贡献值,即可得到最后软阴影效果了。如上图粉色框框起来的x和y点,其水平起点为三角形的底/2,取负,所以是-1.5。如上图所示,红色的p点为阴影处的点。

小孔明的专栏 2335

实时阴影技术(Shadow Mapping)

额外设置一个摄像机在光源位置(Light Camera,光源摄像机),并且朝光照方向看去。用一张 Texture(称为 阴影贴图 Shadow Map)来记录 Light Camera所看到的像素深度(每个像素位置只记录所见最近深度,而不用做别的 shading 计算)来作为遮挡深度。1.2 渲染 Pass主摄像机需要渲染屏幕每个像素时,该像素对应的世界坐标进行 Light Camera 的MVP变换后能得到在 Light Camera屏幕空间中的对应位置 shadowCoord(x’,y’,z’)

gghhb12的博客 3883

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1417

shadow acne(阴影失真)和peter panning(阴影悬浮)

原文链接:https://blog.youkuaiyun.com/lawest/article/details/106364935 总结下来就是: 因为深度贴图的分辨率有限,导致多个像素点采样1个深度,导致阴影失真(acne) 1个解决方法是添加bias,也就是给像素的z加上偏移,这个方法会导致阴影悬浮(peter panning) 最好的解决阴影失真的方法是cull font,只渲背面的深度 可参考:https://zhuanlan.zhihu.com/p/45653702 ------------.

折戟 2949

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

手把手教你为RK3588开发板适配RTL8211F网卡:设备树配置与PHY驱动匹配全流程

本文详细介绍了在RK3588开发板上适配RTL8211F千兆以太网PHY芯片的全流程,包括硬件原理图确认、设备树配置与PHY驱动匹配。通过实战案例和调试技巧,帮助开发者解决常见问题并优化网络性能,适用于嵌入式Linux开发中的Ethernet网络功能实现。

weixin_29184075的博客 526

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果,并且能够实时实现。其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。

code_garden 952

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

[OpenGL] PCF 柔和阴影

PCF通过在每个像素周围进行多次样本采样,并对这些样本进行平均来实现阴影边界的模糊效果,从而平滑阴影的边缘,避免了由于阴影贴图分辨率限制导致的硬阴影边缘。所有的周围像素的结果结合在一起,进行平均化,我们就得到了柔和阴影。

qq_45280097的博客 1040

[deprecated]第四章:TTM分析: 4.2.1 存储分配ttm_bo_validate功能实现分析

ttm_bo_validate是TTM框架中负责验证和调整BufferObject物理内存分配的核心函数,主要用于显存管理。该函数通过placement参数判断BO是否需要迁移或重新分配资源,完成内存分配、迁移及缓存策略调整等操作。实现流程包括资源释放、兼容性检查、迁移保护、新资源分配、迁移实现等步骤,支持多跳迁移和临时缓冲区。典型应用于显存溢出迁移、缓存策略调整、驱动初始化等场景,确保BO始终处于预期状态。

图形/计算GPU的驱动与虚拟化技术分享园地 846

【SpringBoot 3.x 第57节】Spring Boot 3 启动快得不讲武德?揭秘 Spring AOT 编译引擎背后的真相!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1760

Shadow Mapping与光线追踪,软阴影和硬阴影,进行光线追踪(Ray Tracing),光线投射(Ray Casting),AABB包围盒,Oct-Tree 八叉树,KD-Tree,BVH加速

Shadow Mapping与光线追踪,软阴影和硬阴影,进行光线追踪(Ray Tracing),光线投射(Ray Casting),AABB包围盒,Oct-Tree 八叉树,KD-Tree,BVH加速

qq_43157227的博客 2099

【异常】OpenClaw 连接异常This site can‘t be reached 127.0.0.1 refused to connect Try: Checking the proxy

在访问OpenClaw相关服务时,浏览器提示如下异常信息,无法正常加载页面:Try:补充说明:该报错仅出现于本地访问场景(127.0.0.1为本地回环地址),涉及OpenClaw核心服务的本地连接交互,无外部网络及敏感信息泄露风险。

奶爸的编程之路,也就一周冷个三天 1484

GAMES202实时渲染(2)-Precomputed Radiance Transfer

预计算-烘焙技术是实时渲染中的必杀技

763

Claude桌面端安装失败?Retrying无限重试终极解决方案(亲测有效)

Claude桌面端安装卡在Retrying并非网络问题,而是安装器下载源异常导致。本文提供已验证方案:一条命令即可解决问题🚀

XiaoqiangClub的博客 2342

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[游戏中的图形学实时渲染技术] Part1 实时阴影技术

在实时的渲染中PCF的致命缺点是慢,原本的在shadow map贴图中的一次查找变成了 7乘7 甚至是 9乘9 的像素。所以,如果想在实时渲染中使用这种方式的软阴影技术需要对渲染过程进行优化:在抗锯齿的是时候的第一个算法一定是SSAA,但是这样抗锯齿处理算法需要4倍的显存...,但是MSAA其举出思想依旧是一个像素点采样多次,但从原来的全部整个屏幕全部的像素,变成了屏幕画面的边缘部分。PCF的优化也是同理-如下图,软阴影与硬阴影的之间的变化随着阴影的投射物(笔杆)与阴影的接受物(书本)的距离有关。

爱编程的鱼的博客 1348

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

说明PCF(Percentage Closer Filtering)等技术实现软阴影效果

这些技术在阴影映射中的应用可以实现不同程度的软阴影效果,使得渲染出的阴影更加真实、柔和,同时减少了锯齿状边缘和硬阴影的外观。在游戏和虚拟场景中,软阴影技术能够提升视觉质量,并增强场景的逼真感。PCF(Percentage Closer Filtering)是一种用于实现软阴影效果的技术,可以在阴影映射中减少硬边缘并使阴影更加真实。

小宝哥Code的专栏 831

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vulkan_PCSS软阴影

本文简述实现,具体步骤原理可查看闫大神高质量实时渲染。 一、PCSS简介 1.1 PCF 百分比渐近过滤(PCF)是一个简单,常见的进行阴影边缘反走的技术。它通过在片段周围进行采样,然后计算样本比片段的更接近光源的比例,使用这个比例对散射光和镜面光成分进行缩放,然后对片段进行着色。使用这一技术后,阴影边缘看上去进行了模糊一样。 但对于较大物体的内部的采样是一个较大的浪费,我们并无法只针对物体边界进行采样,所以在性能是具有很大的瓶颈。 1.2 PCSS pcss是距离相关的, 它通过搜索阴影贴图上的附近区域

qq_35312463的博客 2296

GAMES202 PCSS软阴影算法细节解析

在LearnOpenGL框架的基础上实现了一遍GAMES202的PCF+PCSS软阴影,之前学习GAMES202时一些没弄清楚的问题顺便搞清楚了。注:本文中代码和shader均在笔者中实现,因此有一些细节可能和GAMES202作业框架不一致,且对202框架中的一些错误进行了修正。

聚焦游戏和图形引擎开发技术 2621

Games202学习笔记

这是一个2-pass算法,需要对场景渲染两次,1-pass:从光源空间看过去,得到一张深度图,也就是shadow map2-pass:从摄像机处看过去,并将物体转换到计算shadow map深度的空间,得到物体在光源空间的深度,和shadow map中记录的值进行比较,来决定是否为阴影。自遮挡问题因为阴影贴图受限于分辨率,在距离光源比较远的情况下,多个片段可能从深度贴图的同一个值中去采样。图片每个斜坡代表深度贴图一个单独的纹理像素。

zzh123353的博客 1379

webgl通过PCSS生成软阴影

PCSS(Percentage-Closer Soft Shadows)则通过模拟阴影边缘的模糊效果,生成更加逼真的软阴影,与PCF不同之处是:PCF(Percentage-Closer Filtering)通过对深度比较结果进行平均处理。PCSS是在PCF的基础上做进一步改进了阴影边缘的柔和度,使得阴影效果更加逼真。我们看到,尽管PCSS产生的阴影的效果更加真实,但是片元着色器中又增加找遮挡物的操作,这进一步增加了性能的开销,不过现在的GPU的性能都比较强,牺牲一点性能,增加真实感还是比较可行的。

lizhan804311239的博客 783

Percentage Closer Soft Shadows (PCF):实时软阴影渲染核心技术解析

PCF(Percentage Closer Soft Shadows)是实时3D渲染中实现软阴影的关键技术,通过多采样加权融合解决传统阴影映射产生的硬阴影问题。其核心原理是在目标像素周围定义采样核,进行多深度比较后计算阴影占比,实现平滑过渡效果。文章详细解析了PCF的技术基础、实现步骤(采样核设计、深度比较、加权融合)以及关键优化点(采样核类型选择、阴影acne处理、性能优化)。同时介绍了PCSS等衍生技术,对比了不同应用场景下的技术选型建议。PCF凭借简单高效的特点,仍是游戏引擎和实时渲染的基础阴影方案,

分享知识,拥抱变化 1596

GAMES202 作业3

总览 本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (Diffuse) 的场景中,完成屏幕空间下的全局光照效果(两次反射)。 为了在作业框架中实现上述效果,基于我们需要的信息不同我们会分三阶段着色,每个阶段都有相对应的任务。 第一次着色负责计算 Shadow Map 所需的深度值并保存到贴图中。 第二次着色负责计算屏幕空间中,每个像素对应的世界坐标系下位置、世界坐标系下法线、漫反射反射率和可见性信息并最终保存到对应贴图中。 第三次着色基于之前得到的场景几何信息 (像素对应的位置,法线),场景与光源

关宅 1819

GAMES202作业1-实现过程详细步骤

记录了games202作业1的shadowmap、PCF和PCSS的实现过程。

qq_41835314的博客 4847

PCSS 简介

本文简单介绍一下Percentage Closer Soft Shadow的原理,由于本人对于这个东西理解很浅,所以有些想法可能是不成熟的。 谈到PCSS,首先我们要介绍一下PCF(Percentage Closer Filtering),最早在1987年就被人提出的一种过虑算法,当时作者的初衷是用这种算法来改变Shadow Map的走样问题。 我把SDK中的Shadow Map简单改了一下,生成了上面两幅图片。左边的渲染图是经过PCF处理的,而右边是最普通的shadow map算法(

codeboycjy的专栏 1万+

Games202作业1

Games202课程的作业一,内容是基于ShadowMap实现硬阴影和PCF、PCSS的软阴影。

youzongCoding的博客 770
上一篇: C++ strtok_s() 分割字符串
下一篇: LaTex常用符号
宗浩多捞
博客等级 码龄7年 1万+粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

宗浩多捞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值