
就绪·玩家阴影投射
将糟糕的静态玩家阴影投射器转变为实时计算的优质真实阴影投射器
查看大图仅适用于游戏的近期版本
安装方法:
将 .asi 和 winmm.dll 都放入 steamapps\common\Dying Light 2\ph\work\bin\x64 目录中。
如果该目录下已有 winmm.dll,则无需再次放入,只需放入 .asi 文件。
将 .pak 放入 steamapps\common\Dying Light 2\ph\source 目录中。
该 pak 文件包含用于生成阴影实体的 .prefab。
工作原理(非常长的技术说明): 游戏通常会对玩家使用一个静态阴影投射网格,称为“player_shadow_caster.msh”,正如你所看到的,它只是一个通用的秃头男性模型: [img]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786463953-559617008.png[/img] [img width=230]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786477021-1791139616.png[/img] 游戏使用该网格来投射阴影。
我的模组修复了这个问题。
为此,我创建了另一个 .prefab,并在其中创建了两个组件:一个 CoSkinnedMesh,它首先将 TPP(第三人称)默认玩家骨骼模型(player_tpp_skeleton.model)定义为阴影投射器;以及一个绑定到名为“player_tpp.msh”骨架上的 CoSkeleton(不确定该网格是否真的有效,但后续需要它来进行骨骼动画绑定)。
(零售版 prefab 使用一个绑定到 ModelObject 的静态网格,但为了实现精确的阴影,我们首先需要投射真实的玩家模型,而不是静态网格,因此我们需要将 ModelObject 替换为 CoSkinnedMesh,并将 CoSkeletonProxy 替换为与其等效的 CoSkeleton。)
设置好 .prefab 后,我需要拦截原始“fpp_shadow_mesh.prefab”作为 CEntity 创建的位置,同时让游戏也创建我的 .prefab 实体。这样既能确保游戏原有的必需内容被创建,也能满足我自定义 prefab 的需求。但仅此还不够,只做这些更改不会改变任何东西,因为原始 prefab 中的原始网格仍将被用作阴影投射器,所以我们还需要执行一些额外的步骤来让自定义投射器工作:
首先,你需要隐藏原始的阴影投射器。可以通过对原始的 fpp 阴影
ModelObject类调用IModelObject::EnableRenderingShadows,并将参数 a2 设为 0 来实现。其次,你需要将自定义的阴影实体(在世界某处创建)移动到当前阴影投射器的位置。可以通过对原始
ModelObject类调用IControlObject::GetWorldXform,然后使用自定义实体中的CoSkeleton类调用CoHierarchy::SetWorldXform来移动自定义实体。第三,你需要按照游戏通常执行的原始逻辑,用正确的玩家服装数据填充自定义的
CoSkinnedMesh。第四,你最终需要通过将
CoSkinnedMesh+0x74处的双字与值0x1F进行按位或运算,来启用自定义CoSkinnedMesh的阴影渲染。
完成所有操作后,结果会变成这样: [img width=492]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786473238-877424095.jpg[/img] 会出现一个生硬、无法移动的阴影,同时当前的玩家模型也会穿透过你的相机。 要修复此问题,你首先需要隐藏穿模的网格,然后修复动画。
修复穿模:
进入 CVisibilityManager::DetermineVisibility,在游戏写入 CoVisibility+0xB8(网格可见性标志)的位置,使用掩码 0xFFEFFFFF 执行与(AND)运算,这将清除“bVisible”位并禁用穿模网格。
修复动画:
这可以说是最难且最难以解释的部分,你需要在原始的 CoSkeletonProxy 和你的 CoSkeleton 之间执行多项操作来正确同步所有骨骼,但基本上包括搜索原始 CoSkeletonProxy 中的骨骼名称(及其值),并将完全相同的内容复制到自定义的 CoSkeleton 中。(你需要使用诸如 CoSkeleton::GetLocalXformsWriteInvalidateAll、CoSkeleton::FindElement、CoSkeleton::UpdateModelXforms 以及 CoSkeletonProxy 中用于获取骨骼数量、查找元素等的其他几个虚表调用。)
完成所有这些操作后,你会得到类似这样的效果:
[img width=496]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786473923-1752549502.jpg[/img]
效果已经相当不错了,但仍需修复。目前它只适用于装备部件,而用于全套服装时会崩溃,所以你需要实施另一项修复,基本上需要同步 CoSkinnedMesh 正在使用的模型,使其始终使用服装的 TPP 版本。之后,基本上就不会有其他问题了,你也将能够查看储藏处服装的阴影(很确定这也适用于自定义服装):
[img width=492]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786474273-1203195290.jpg[/img]
不要在意这些截图中的手部位置,这是由太阳在当前天气下产生阴影的方式,以及引擎计算阴影方式(以及动画表现方式)的偶尔差异造成的。它们完全没问题,正如你在这张截图中所看到的,自定义模型的身体完全正常: [img width=491]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786474586-1569488082.jpg[/img]
如果你觉得奇怪,请注意这就是游戏的计算方式。作为参考,这是在这个阳光明媚的下午时段,默认的玩家阴影投射器(未应用模组)的样子: [img width=490]https://staticdelivery.nexusmods.com/mods/4302/images/1986/1986-1786474741-1859097086.jpg[/img]
还没有人评论,去客户端里说两句吧。
评论在新手盒子客户端中发表,这里同步展示。