Ark-Pets icon indicating copy to clipboard operation
Ark-Pets copied to clipboard

[Bug] 桌宠的Spine组件之间出现低Alpha缝合线的调查报告

Open isHarryh opened this issue 5 months ago • 0 comments

问题描述

在(除动态立绘外的)几乎所有的桌宠渲染后,在它们的 Spine 组件之间(例如头发、眼眶和膝盖处)均可见一条缝合线。如图所示: image

因为缝合线后面的背景可以穿透过来,所以推断缝合线是由低 Alpha 值导致的。为便于观察具体的 Alpha 值分布,进行 Alpha 单通道上色后,结果如图所示: image

可见,缝合线的 Alpha 值主要介于 0.5-0.95 之间,以 0.75-0.95 居多。

调查过程

1. 检查 Spine 源图片

Spine 源图片采用解包后图片的 RGB-A 通道合并而生成,理论上不可能出现错误。观察 Spine 源图片,未见组件边缘的颜色和 Alpha 值异常,如图所示: image

2. 检查着色器的光照处理逻辑

通过对 TwoColorPolygonBatch 使用的着色器的光照和预乘 Alpha 进行调试,初步判断此问题不是由光照处理逻辑引起的。

3. 检查低 Alpha 色块的 RGB 值

在片段着色器进行一些处理,使得 Alpha 大于 0.5 的部分变为完全不透明,以此检查这些部分的 RGB 值。

gl_FragColor.a = gl_FragColor.a < 0.5 ? gl_FragColor.a * 2.0 : 1.0;

得到的渲染结果如图所示: image

可见,缝合线的 RGB 值表现为灰度而非彩色。处理后,缝合线以灰度模式填充,这一结果与使用其他渲染引擎得到的结果是一致的。

但是在游戏中,尤其是模型的膝盖部分,并不是灰度填充,而是与相邻组件具有相似颜色。

解决建议

综上所述,高度怀疑游戏中使用了特殊的着色器,消除了缝合线。

为了缓解桌宠的缝合线问题,给出两种解决方案:

  1. 直接将缝合线的 Alpha 值提高(正如“调查过程.3”所提及的那样),将缝合线填充为灰度。
  2. 编写额外的着色器代码,将缝合线填充为相邻组件的颜色。

isHarryh avatar Sep 07 '24 04:09 isHarryh