白狼 - Hairworks 颜色修复

白狼 - Hairworks 颜色修复

为hairworks发型进行色彩校正,以减少在使用光线追踪或路径追踪时由暖色光照引起的橙色辉光。

注意: 我将此发布视为社区资源。我不是数字艺术家或游戏程序员。任何其他模组制作者都可以使用此信息或我的模组文件来改进解决方案,在这些情况下,我唯一的要求是注明出处。

描述

此模组旨在解决与 HairWorks 发型上光线追踪/路径追踪暖色光照相关的“橙色光晕”问题。

安装说明

使用你喜欢的模组管理器安装,或将 zip 内容复制到游戏目录中。同一时间仅使用一个版本的模组。

主要功能

此模组编辑头发纹理,并为每个纹理添加少量蓝色色调以调整反照率(albedo)值。

模组有 3 个版本(轻、中、强)。每个版本依次更冷,从而在暖色光照下呈现更白/灰的颜色,代价是在中性光照下白色更多、灰色更少。请选择适合你口味的版本。

需求

《巫师 3:狂猎 — 次世代版》 无需任何前置模组。

与修改现有头发纹理文件的模组不兼容。不兼容第三方发型。

技术细节(在 Claude 的协助下)

供巫师 3 模组制作者 / 想了解其原理的玩家参考。

问题所在

开启光线追踪或路径追踪时(v5.01 次世代版),杰洛特的白色 HairWorks 头发和胡须在火焰、火把及其他暖色光源附近会变成金色或橙色。在中性日光下头发看起来正常。

头发纹理不是原因。 杰洛特的头发和胡须颜色纹理是中性灰色。半马尾根部纹理的平均值约为 RGB (104, 102, 98)。

路径追踪器才是原因。 在路径追踪下,头发的最终颜色大致为光源颜色乘以头发的反照率。头发颜色深,在多次反弹中吸收光线,因此暖色光会强烈地为其着色。橙色光下的中性反照率会呈现为橙色。反弹次数也有影响:在测试中,4 次反弹比 1 次反弹呈现的橙色略深。

决定 HairWorks 颜色的因素。 对于 HairWorks 发丝,根部和尖端颜色纹理决定颜色。头发的 .redfur 文件通过其 rootColorTex 和 tipColorTex 句柄指向它们。在测试中,另外两个值没有效果:

  • .redfur 文件中的发丝 Color 值。
  • 卡片网格上的 VarianceColor。

此模组附带颜色纹理的略偏蓝色的副本。它不修改脚本、着色器或设置。暖色光随后会乘以略冷的反照率,最终结果更接近灰白色。

涉及哪些纹理: 共九个纹理,覆盖游戏中全部七个 HairWorks 头发物品:

  • 胡须,根部和尖端
  • 长发(c_04_mg__long)发型
  • 剃尾发型
  • 半马尾发型
  • 刺尾发型
  • 来自 dlc2 的凌乱发型

色调是如何制作的:

  1. 从游戏的 texture.cache 中读取每个纹理。
  2. 解码每个 mip 的每个 DXT1 块。
  3. 在线性光照下乘以每通道增益。
  4. 使用 PCA 端点和最小二乘细化重新编码。

仅更改 DXT1 端点不起作用。红色和蓝色各只有 5 位,因此微小的色调会被舍入掉。

加载方式:

  • 模组附带一个 texture.cache(版本 7),包含原始缓存键和真实数据页数,外加一个 blob0.bundle 和 metadata.store。
  • 缓存键是小写化完整 depot 路径的 Java 哈希(h*31+c)。两个早期构建加载失败,保留原始键和真实页数解决了问题。由于我同时更改了两者,所以无法确定是哪一个起了作用。
  • bundle 携带未更改的 .xbm 头。
  • 每个构建都会重新打开并检查:缓存版本、页数、键、mip 尺寸、bundle 往返和 store 重新生成。

三个版本

版本 红色 绿色 蓝色
轻 0.94 1.00 1.18
中 0.92 1.00 1.24
强 0.90 1.00 1.30

测量结果

我从截图中测量了强版本对半马尾根部纹理的影响,以头发的蓝/红比值表示:

光照 原始 强
火光 0.34 0.43
日光 0.72 0.86

强版本在暖色光下明显更好,但会使中性光看起来稍冷。

限制

  • 色调是静态的。 它无法区分火光和日光,因此每种强度都会在中性光照下损失一些准确性。感知光照的色调需要运行时方法。
  • 范围仅限 HairWorks 头发。 Fancy Bowl、Rabble Rouser 以及关闭 HairWorks 时显示的网格头发不会被更改。
  • 每次测试都需重启。 Bundle 仅在游戏启动时加载。
  • 兼容性: 任何替换相同颜色纹理或为其提供自己的 texture.cache 条目的模组都会冲突。