Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
isHarryh opened this issue Sep 7, 2024 · 0 comments
Open
Labels
Bug Something isn't working

Comments

@isHarryh
Copy link
Owner

isHarryh commented Sep 7, 2024

问题描述

在(除动态立绘外的)几乎所有的桌宠渲染后,在它们的 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 isHarryh added the Bug Something isn't working label Sep 7, 2024
@isHarryh isHarryh pinned this issue Oct 7, 2024
@isHarryh isHarryh unpinned this issue Nov 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant