fix: 阴影光源位置计算反向 + lookAt 垂直光退化——影子可见
根因1(致命):光源位置写成 lightDir*30。lightDir 是光的传播方向 (指向场景),乘 30 后光源跑到场景下方——从地面下方向上打光, 地面永远是光线第一个交点,物体永远不可能遮挡地面,影子恒不存在。 修复:光源位置 = -lightDir * 30(逆传播方向退回)。 根因2:垂直光(direction≈(0,-1,0))时 lookAt 的 up=(0,1,0) 与视线 平行,叉积为零 → 矩阵 NaN → shadow map 全垃圾。修复:|dir.y|>0.99 时改用 (0,0,1) 作为 up。 场景:地面 quad(Model::CreatePlane 程序化构造,AssetManager 缓存) + 主光调平让影子落在相机视野内。已截图验证影子可见。
This commit is contained in:
+9
-2
@@ -42,6 +42,13 @@ protected:
|
||||
// 模型资产(AssetManager 负责加载/缓存/生命周期,返回句柄)
|
||||
auto backpack = GetAssets().LoadModel("assets/models/backpack/backpack.obj");
|
||||
|
||||
// 地面:接收阴影
|
||||
auto ground = GetAssets().CreatePlane(30.0f, "assets/textures/default.tga");
|
||||
auto groundEntity = scene.CreateEntity("Ground");
|
||||
groundEntity.AddComponent<TransformComponent>().world =
|
||||
glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, -2.0f, 0.0f));
|
||||
groundEntity.AddComponent<MeshRendererComponent>(MeshRendererComponent{ground});
|
||||
|
||||
// 相机实体(primary = 当前渲染视角)
|
||||
m_Camera = scene.CreateEntity("MainCamera");
|
||||
auto& camera = m_Camera.AddComponent<CameraComponent>();
|
||||
@@ -61,10 +68,10 @@ protected:
|
||||
m_Spinners.push_back(e);
|
||||
}
|
||||
|
||||
// 灯光实体
|
||||
// 灯光实体(主光较平,影子拉长可见)
|
||||
scene.CreateEntity("KeyLight")
|
||||
.AddComponent<LightComponent>(
|
||||
LightComponent{glm::vec3(-0.5f, -1.0f, -0.3f),
|
||||
LightComponent{glm::vec3(-0.5f, -0.6f, -0.35f),
|
||||
glm::vec4(1.0f, 0.95f, 0.9f, 1.0f)});
|
||||
|
||||
scene.CreateEntity("FillLight")
|
||||
|
||||
Reference in New Issue
Block a user