在 WebGL 中实现阴影时遇到问题

Trouble implementing shadows in WebGL

我正在尝试使用本教程在我的 WEBGL 2.0 项目中实现阴影 https://webgl2fundamentals.org/webgl/lessons/webgl-shadows.html 目前我得到这样非常糟糕的结果:

基本上,大量的地形被绘制在不应该出现的阴影中。光线投射是从你的相机朝向你正在看的方向,所以假设你不应该看到任何阴影,因为光线投射与你的相机相同(我这样做只是为了测试,直到我能正常工作)

除了我使用的是 glMatrix 而不是他们的矩阵数学库(我认为应该无关紧要),我相信我拥有与教程相同的所有内容。事情是这样的。我不对我正在渲染的任何东西使用模型视图矩阵,所以 none 我的点在 -1,1 范围内。它们可以远至 -3200...等等 它只是一个大地形网格块。 我认为问题在于我如何创建纹理矩阵

textureMatrix = glMatrix.mat4.create();

glMatrix.mat4.translate(textureMatrix,textureMatrix,[0.5,0.5,0.5]);
glMatrix.mat4.scale(textureMatrix,textureMatrix,[0.5,0.5,0.5]);
glMatrix.mat4.multiply(textureMatrix,textureMatrix, projectionMatrix);

glMatrix.mat4.invert(lightMatrix,lightMatrix);
glMatrix.mat4.multiply(textureMatrix,textureMatrix, lightMatrix);

我使用与您的正常投影相同的光投影矩阵,这是个问题吗?如果有人能提供帮助,将不胜感激。

这可能是因为你的光的 Y 位置(在你的例子中,它是眼睛和场景之间的距离)对于你的阴影体积的 Z 大小(你的阴影体积的大小在视图方向。)这里如果 posY 在线框框内:

但是如果你将 posY 增加太多(即你的形状超出阴影体积,它们就会消失

所以你应该增加你的阴影体积的大小(或者缩小你的场景,无论哪种方式。)你不能用滑块模拟它,因为它们只是让你控制两个维度 X 和 Y 维度:projWidth 和projHeight.

即在教程页面的最后一个代码中,最新的参数 ("far") 例如将其从 10 更改为 100

const lightProjectionMatrix = settings.perspective
    ? m4.perspective(
        degToRad(settings.fieldOfView),
        settings.projWidth / settings.projHeight,
        0.5,  // near
        10)   // far
    : m4.orthographic(
        -settings.projWidth / 2,   // left
         settings.projWidth / 2,   // right
        -settings.projHeight / 2,  // bottom
         settings.projHeight / 2,  // top
         0.5,                      // near
         100);                      // far

然后你可以增加 posY 更多:

没有您的完整代码,很难重现和帮助您。您不能尝试将您的场景注入教程代码吗?您可以使用相同的输入将视点与光源和方向绑定:(只需将 0.5 添加到 X 以查看一点阴影并确保它被正确计算。)

/*const cameraPosition = [settings.cameraX, settings.cameraY, 15];*/
const cameraPosition = [settings.posX+0.5, settings.posY, settings.posZ];
/*const target = [0, 0, 0]; */ 
const target = [settings.targetX, settings.targetY, settings.targetZ];