我一直在尝试让方差阴影映射在我的 webgl 应用程序中工作,但我似乎遇到了一个可以使用一些帮助的问题。简而言之,我的阴影似乎在比我在那里看到的例子更小的距离上变化。即阴影范围是从 0 到 500 个单位,但在 5 个单位之外的阴影是黑色的,在 10 个单位之外几乎不存在。我下面的示例基于这两个链接:
在这两个示例中,作者都使用聚光灯透视投影将方差值映射到浮点纹理。在我的引擎中,到目前为止,我一直尝试使用相同的逻辑,但我使用的是定向光和正交投影。我尝试了这两种技术,结果对我来说似乎总是一样的。我不确定这是否是因为我使用正交矩阵进行投影 - 我怀疑可能是。这是问题的图片:
请注意,盒子距离圆圈只有几个单位,但即使相机阴影为 0.1 到 500 单位,阴影也更暗。
在光影通道中,我的代码如下所示:
// viewMatrix is a uniform of the inverse world matrix of the camera
// vWorldPosition is the varying vec4 of the vertex position x world matrix
vec3 lightPos = (viewMatrix * vWorldPosition).xyz;
depth = clamp(length(lightPos) / 40.0, 0.0, 1.0);
float moment1 = depth;
float moment2 = depth * depth;
// Adjusting moments (this is sort of bias per pixel) using partial derivative
float dx = dFdx(depth);
float dy = dFdy(depth);
moment2 += pow(depth, 2.0) + 0.25 * (dx * dx + dy * dy) ;
gl_FragColor = vec4(moment1, moment2, 0.0, 1.0);
然后在我的影子通道中:
// lightViewMatrix is the light camera's inverse world matrix
// vertWorldPosition is the attribute position x world matrix
vec3 lightViewPos = lightViewMatrix * vertWorldPosition;
float lightDepth2 = clamp(length(lightViewPos) / 40.0, 0.0, 1.0);
float illuminated = vsm( shadowMap[i], shadowCoord.xy, lightDepth2, shadowBias[i] );
shadowColor = shadowColor * illuminated
首先,我是否应该对正交投影做任何不同的事情(它可能不是这个,但我不知道使用上述两种技术会发生什么:()?如果不是,我能做些什么来得到更均匀的阴影蔓延?
非常感谢