PointShadowFilter
PointShadowFilter
一个专为点光源立方体阴影贴图设计的PCF(百分比接近过滤)函数节点。它在立方体贴图的UV展开上以固定的3×3采样模式进行深度比较并求平均,从而将点光阴影的锯齿边缘平滑为软阴影。
核心优势
针对点光阴影做了方向空间到贴图UV的转换与采样分布优化,封装了九点PCF采样与深度比较逻辑。无需手写立方体坐标到UV的转换,也无需自己配置采样内核,即可获得稳定、可控的软阴影质量。
常见用途
室内或局部光源(灯泡、烛火、手电)产生的全向软阴影
角色携带点光源时的实时阴影柔化
在风格化渲染中获得更柔和的点光阴影过渡
如何调整
该过滤器的柔和度主要由 `shadow.radius` 决定;其采样步长由 `texelSize.y` 决定,间接受 `shadow.mapSize` 影响。`radius` 越大,3×3核覆盖范围越宽,阴影越柔;贴图分辨率越高,同样的半径会得到更精细的边缘。若出现“阴影粉刺”或“皮特潘效应”,请配合调整光源的 `shadow.bias` 与 `shadow.normalBias`。
代码示例
1// JS:配置点光阴影
2pointLight.castShadow = true;
3pointLight.shadow.mapSize.set( 1024, 1024 );
4pointLight.shadow.radius = 1.0; // 半影宽度
5
6// TSL:通常无需显式调用,pointShadow 内部会选择合适的过滤器。
7// 若实现自定义点光阴影流程,可直接使用:
8const factor = PointShadowFilter( {
9 depthTexture, // 点光阴影深度贴图(立方体展开/atlas)
10 bd3D, // 片元到光源的方向(带偏移)
11 dp, // 深度比较值
12 texelSize, // 由 mapSize 推导的像素尺寸
13 shadow // 阴影上下文,提供 radius 等
14} );
15
16diffuseColor.rgb *= factor;