原神雷蛇灯效的探究与利用
在2.3版本的更新中,原神增加了对雷蛇灯效的支持,本文对这一功能进行了探究与利用。
注意:本文仅作为过程记录,非详细教程,转载请注明出处。
首先来到雷蛇的英文官网,在Chroma Workshop的Games里找到原神,可以看到原神的灯效机制:
- 在登陆界面和画面配合
- 在角色选择界面和当前角色的元素属性配合
- 在地图上和当前角色的元素属性配合
- 施放元素爆发时和元素属性配合
- 在武器详情界面和武器星级配合
- 在祈愿时和获得的角色或武器星级配合
虽然手头没有支持雷蛇Chroma灯效的设备,但雷蛇提供了一个模拟器,可以实时预览不同类型设备的灯效。模拟器只支持SDK设置的灯效,不支持管理软件里的设置。在使用模拟器前,先安装雷蛇的驱动软件Synapse,安装时需要勾选Chroma Connect。即使不启动,它所安装的一大堆后台服务也会一直运行,所以平时不用打开。无论是Synapse还是模拟器都会强制安装到C盘,比较烦人。
从模拟器的预览可以看出,除了祈愿是固定单色之外,其他情况的灯效应该都是循环的图像,且所有类型的设备灯效参数相同。祈愿的灯效只在角色或武器的图片跳出时出现;元素爆发时图像变化更快,但不确定是否是同一组图像。图像的颜色范围较大,在模拟器里看到的颜色相对连贯,但从实物视频来看效果并不理想:岩元素的浅棕和深棕色变成了黄色和粉色;火元素的橙红色变成了浅黄色和浅粉色;冰元素和水元素的区分没有模拟器中明显;部分图案变化时会闪现杂色。图像的变化速度也比较大,无论是能看出图案的键盘能还是其他灯较少的设备都闪得很快。虽然实际设备一般自带柔光,可以缓解闪烁,但看起来仍然比较奇怪。Chroma SDK提供的API是可以对6种设备类型设置不同的参数的,也可以对单个设备设置。所以目前原神对雷蛇灯效的设置是比较偷懒的:没有对不同类型的设备分开设置,没有优化闪烁过快的问题,也没有优化实际设备的色差问题。
看完了灯效效果,接下来研究如何在没有Chroma设备的情况下利用灯效。首先需要研究如何拿到灯效参数。从SDK可以得知游戏对灯效的设置是通过调用雷蛇的动态库完成的,动态库安装在系统目录且有数字签名。游戏调用的时候会验证签名,验证不通过则不会开启功能,所以替换文件行不通,而其他在内存里进行的方法会被当成外挂,也是不可行的。
这时候就该模拟器发挥作用了,只要能仿照它接收灯效参数,就可以达到目的。模拟器可以在Github上的razerofficial/ChromaEmulator下载,目前还在测试阶段,版本为2.1.1,以后可能会改动。观察模拟器目录可以确定是用electron写的,解包之后发现代码没有做混淆。包的里外各有一个ChromaEmulatorService.exe,在任务管理器查看命令行可知是包里的在实际运行,是和模拟器同时运行的服务程序。阅读模拟器的代码可知它是通过websocket通信来获得灯效参数的,通信的对象就是服务程序。只要手动运行该程序,用同样的方法通信,就能拿到灯效参数,解析后得到每个灯的RGB颜色值。
拿到灯效颜色后,接下来研究如何应用到自己的键盘上。本人的键盘配置为一个可以单键设置背光的主键盘和一个只能统一设置背光的小键盘。主键盘的驱动软件比较难搞,但是小键盘的驱动软件也是electron写的,所以可以研究一下。解包后发现代码做了混淆,好在操作设备的方法名都在,分析一番可知是通过node-hid读写HID设备实现功能的,照葫芦画瓢即可读写背光颜色。该键盘的背光是通过亮度、色相和饱和度设置的,即HSV模型,而灯效颜色是RGB颜色,所以需要进行转换,转换公式可以在维基百科查到。
读写HID时遇到了一个坑,记录如下。一般打开设备时使用的是设备的两个ID,但是测试时发现不能正常读写。枚举设备可以发现有若干ID相同但路径不同的设备,使用ID只能打开其中某一个。解决的方法是枚举出所有该ID对应的路径,再使用路径打开设备,进行一次测试读写,从而找到正确的设备。
为了节约生命,使用Python实现所有功能。首先运行模拟器的服务程序,然后使用websocket-client进行通信,最后在消息处理函数中用hidapi设置键盘背光颜色。获取灯效参数时选择了只有2个LED的设备,但原神给出的颜色仍然很闪,目前做了简单的平滑处理。代码已上传到Github上的Xrysnow/MyChromaDevice。