c++ - 稳定级联阴影映射中的光视图矩阵
问题描述
我最近实现了级联阴影贴图,并通过关注这篇文章使其稳定。现在一切正常,除了当我将定向光移动到世界的顶部时,阴影突然变暗。通过一些调试,我发现光视图矩阵导致了问题。
这就是我计算视图矩阵的方式:
glm::mat4 view = glm::lookAt(
center + lightDirNorm * nearOffset,
center,
camera.worldUP
);
center
是边界球体中心,worldUP
是 的常数值vec3(0.0, 1.0, 0.0)
,lightDirNorm
是从世界原点到光照位置的归一化光照方向。
当我将灯光位置移动到 时vec3(0.0, 20.0, 0.0)
,lightDirNorm
变为vec3(0.0, 1.0, 0.0)
。worldUP
在这种情况下,视图方向与矢量在同一条线上。因此,不可能进行叉积和计算right
向量。这很麻烦,因为它是一个常见的光线方向。
因为阴影是稳定的,所以worldUP
这里使用的向量必须是常数。我能想到的唯一解决方法是向worldUP
向量添加一个小偏移量,使其像vec3(0.00001, 1.0, 0.0)
.
我想知道是否有更好的方法来处理它?
解决方案
“使其稳定”不适用于方向改变的光源。稳定性是指光源静止时相机的移动。因此,您可以选择任何正交up
向量作为 的函数lightDirNorm
,它会使您的阴影保持稳定。
我还建议远离任何lookAt
功能。而是通过方位角和高度指定光线方向,并使用旋转矩阵来计算视图矩阵,而不会有任何奇异点的危险。
推荐阅读
- sqlite - 我需要帮助为我的课程创建一个明确的内部连接
- python - 如何构建一个 Python 比较器,以 PostgreSQL 的方式对字符串进行排序?
- java - Spring MVC 轮播
- android - Ionic Cordova 7.1.4 Android 构建失败
- c++ - 如何处理来自另一个线程的 win32 事件?
- python - Python从字符串中删除嵌套的unicode'u'符号
- amazon-web-services - 无法使用 Postman 使用预签名 URL 将文件上传到 S3。错误:签名不匹配
- javascript - 将元素绝对定位在部分底部会添加不需要的第二个滚动条
- c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法
- html - 每行中具有相同高度单元格的表格布局