这里我们来搭建一个莱莎的角色展示demo,感觉还是很实用的,后续可以更改ui和人物,来做个自己的Demo.

demo需要的部分有,角色的动作切换,角色的皮肤切换,角色的shader实现。

前两者基本由脚本加ui就可以实现了。

在做动作的时候,久违的复习了一遍Animator,在人物rigging的部分学到了很多,在这里记录一下。

上面是做好的一个Avatar。已经非常完美地符合unity所要求的的T-Pose了,这是我们想要达到的效果。

而一开始打开avatar,我们先reset.

之后我们可能就会看到一张报错很严重的avator了

这里我们就需要手动去修正这些骨骼数据,包括去旋转,以及重选关节处对应的骨骼。

操作到如下形式,该示例图中的虚线部分对应的骨骼甚至不绑也没有关系,当然还是到Animator里看看效果最直接。如此这般,以前一些骨骼错误的mmd模型,说不定就可以使用了。

接下来,就是一系列比较复杂的准备过程,把每个模型换上我们对应的shader,再做成prefab,待后面使用。

Shader部分

shader部分跟上一个碧蓝幻想的差距还是比较大的。针对不同部位,分为了Common,Eye,Hair,

Face,noOutLine。最重要的还是Common,其他shader基本是在此基础上修改的。补一点,shader的结构为何不同,果然还是要根据给定的贴图来实现相应的效果。

Common有一个卡渲pass和一个描边pass,描边pass还是熟悉的观察空间外拓,就不重复了。

首先是基础的数据准备部分,熟悉的normal,以及获取一些贴图附带的信息。

diffuse部分使用了三层的ramp去控制diffuse颜色的变化。值得注意的点是我们ramp中加入了顶点颜色去控制,到时候就可以实现顶点刷来修改部分效果。当然,这部分也可以使用自定义变量来控制,但这就将作用到整个范围,还是上者更好。

这里的lerp也是之前没怎么见过的用法。

到了spec部分,熟悉的Half,这里的spec_term做了一个与0.0001取max的操作,主要是防止一些负数出现,final_spec就是spec_term*ao*color*intensity*mask就好了,这里ao与mask并不一致。

接下来就是rim部分了,这里的fresnel其实就常规rim的因子了,可以提取出当前模型的边缘部分,后面就是用反射光来采样cubumap了,不是很熟悉啊,最好还是记一下吧,这种感觉还是记忆性或经验性的步骤,记住就好了。效果如下:

Toon_Eye

eye部分主要由视差偏移,以及一个对环境的反射,与diffuse混合,又经历了一个ToneMapping,实现了眼睛颜色更真实。

这是我们会用到的一些函数,RotateAround用于旋转一个向量,这里我们用它来旋转reflectDir使得两只眼睛反射朝向两边,更自然,当然要配合参数使用,到时候来看看这个项目就好了。

后面一个就是用于Tone Mapping的,当然做完以后记得pow(,1/2.2)或sqrt,sqrt是一种粗略的方式

然后我们就要看到目前为止第一个视差偏移的应用啦,当然之前也有用到过,虽然没写。

这里比较独特,没有使用height图,选择了以中心根据distance直接生成了一张深度图,后面offset的计算及比较复杂了,先获得了切线方向下的视线方向,然后在一对操作猛如虎就结束了。

之前写的的视差偏移会有些不同,大致代码我贴一下:

不断迭代uv_parallax获取更准确的视差偏移后的坐标,原理在关于视差算法的基本原理与拓展应用 – 哔哩哔哩 (bilibili.com)这篇文章里讲得很好,我就不多叙述了。

之后眼睛部分还剩下diffuse和env

以上,和常规有区别的就在有关color的地方都作了2.2次幂,为了后面tone_mapping做准备,还有env处计算量当前环境色的明度,并乘了回去。

之后就常规ACES,就可以在伽马的颜色空间中得到更加真实的颜色效果了。

Toon_Hair

hair是我们要介绍的最后一个模块了,在头发的渲染上,有其他有所不同的,在高光的计算上。

头发具有各向异性的性质,所以会形成类似天使环的高光形状。原理是蛮复杂的,但可以暂且不管,只要他看上去是对的,那他就是对的(doge)。

代码如上,其实代码也挺复杂的。唔好吧,gpt生成的解释和废话也没差太多,那也就只能遇到一个记一个了,核心应该就spec_term=exp(-(TdotH^2+BdotH^2)/(1+NdotH)),再乘以一个高光的衰减系数,通过half_lambert/NdotV,式子蛮对称的,希望忘的时候能找到。

下面贴两个相关的帖子,希望以后回去看:头发渲染各向异性高光 – 知乎 (zhihu.com)

图形学基础|各项异性与头发渲染_各向异性渲染_桑来93的博客-CSDN博客

到这里呢角色的shader就只剩下skin和noOutLIne的了,但其实这两个与Common的差得很少,就不继续水了。

到此角色Demo的前期准备和shader编写就结束啦,啪叽啪叽,后面有时间的话,会看看嫖的ui交互界面怎么写的,以及一些Dynamic Bone使用的体验,希望这次的经验能活用于下次。

您必须 登录 才能发表评论