使用 UE Viewer 工具 提取 罪恶装备 游戏资源,可以得到人物的3D模型+贴图, 工具链接:
还原游戏效果主要用到 3 张贴图 + 模型顶点色,分别是 :
BaseColor 贴图
ilm 贴图
SSS 贴图
顶点色
计算 N Dot V :
计算 边缘光 范围 : ModifyNdotV = 1 - NdotV + RimLightSize
让边缘光明暗更加分明, 这里需要注意的是,在阴影里面的部分不需要 边缘光: (ModifyNdotV > 0.1) - (Shadow)
结合BaseColor + 调色,最后的边缘光:RimLightOutput
计算 N Dot H , (H = V + L) :
优化 高光 区域,这里 用 ILM 贴图的 B 通道会保存 身上哪一些区域的高光:(ILM 贴图的 B 通道)
ModifyNotH = ColorBurn (N Dot H, ILM.b)
ColorBurn颜色加深
再优化高光效果,控制高光的大小 :SpecRamp = ModifyNotH > (1 - SpecularSize)
ILM的R通道限制高光显示区域,最后 高光+调色 :ILM的R通道
高光输出 :
计算 N Dot L :
优化阴影效果,利用 ILM.G + VertexColor.R :(用 ILM.g 通道自定义阴影部分)
VertexColor.R 通道 记录 AO
N dot L Modify = (NdotL + LightPush) * VertexColor.R * 0.5 +( ILM.G * 2 - 1 ))
第一层 阴影 计算,结合光照计算+预定义
处于 Shadow2Push <= NdotLModify < Shadow1Push 之间
(需要注意的是,这里可以添加顶点阴影)
结合以后两者,得到第一层阴影
第二层阴影 :
S1 = 1 - (VertexColor.R > Shadow2VertexThreshold)
S2 = NdotLModify < Shadow2VertexThreshold
S = max(S1, S2)
永久阴影 :
ILM.G < PemanentShadowThreshold,第一层+第二层阴影都会去考虑这个 (ILM.G)
ILM.G > PemanentShadowThreshold
最后的光照范围
BaseRamp = 1 - Shadow1 - Shadow2 - PermanentShadow
思路 : 以上我们得到了 BaseRamp ,是光照阴影结果,在 BaseRamp 可以知道,哪一些区域是阴影,哪一些区域不是阴影,在阴影的部分使用 暗一点 的 “颜色”,不在阴影的部分就使用 亮一点 的 “颜色”
NewBaseRamp = 1 - BaseRamp, 用来标记哪一些区域在阴影,哪一些不在阴影
不在阴影的部分,使用 Base 贴图 + 高光,高光在之前已经算好了 (Base + Spec)
阴影区域的底色,Base * SSS
第一层 阴影 颜色,Base * SSS 添加 Shadow1Color 和 校色
第二层 阴影 颜色,Base * SSS 添加 Shadow1Color 和 校色
根据 1 - 第一层阴影,混合 第一层阴影颜色 和 第二层阴影颜色,为了里面方便,红色是第一层,蓝色是第二层
混合两层阴影:
根据 NewBaseRamp 来混合 Base + Spec 和 两层的阴影颜色
结合阴影效果
再结合边缘光可以得到
ILM.Alpha 保存了描边:
结合描边,可以得到最后的效果