使用 GL_CLAMP_TO_EDGE,您的阴影纹理将在每个方向上重复第一个和最后一个像素,这会导致非常不可预测的结果
如果您夹到边框并将边框颜色设置为 (1,1,1,1),您将获得干净的边框,但根本没有阴影。
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor,new float[] {1f,1f,1f,1f});
扩展投影大小是在整个场景上按预期进行阴影的唯一方法(其中 lightSize 是相关大小的正交示例。):
lightProjection = Matrix4.CreateOrthographicOffCenter(-lightSize, lightSize, -lightSize, lightSize, lightZNear, lightZFar);
但是这样做会降低阴影贴图的分辨率,必须使用一些常用技术对其进行过滤,请参阅 pcf 之类的“软阴影过滤”。
向前迈出的一步不是使用“级联阴影”之类的技术来处理取决于场景距离的多个阴影贴图分辨率......