永远相信美好的事情即将发生 😊!

实现Anisotropic Cel-shading Hair(URP)

分享 Mavis 9℃ 0评论

之前卡通渲染的高光实现中,实现的是更真实的发丝效果,但是在实际的卡通渲染中,往往是这个样子的(图源米哈游制作技术分享):

再看看我们之前实现的效果:

所以我们需要对之前的计算再加上一些卡通渲染的技巧,先看看能不能通过调整参数的情况下逼近我们想要达到的效果:

ok,可以看到当噪声图的放大很多以后,由于很多点选取同一个噪声值,所以突变的就没有那么明显,但是可以看到还是跟想要的效果有差距,应该要变成一个色块,我们先用step来试试:

specular = light.color.rgb * _SpecularCol.rgb * step(0.5 , StrandSpecular(T, viewDirWS, lightDirWS, _SpecularExponent, _SpecularScale));

ok,有那感觉了,然后把0.5变成参数调节一下看看:

ok,算是有点效果了,但是还是跟想要的效果有些差距,就是noise不够连续,还是太突兀了,没有那种圆润的感觉,其次观察想要的效果可以发现高光的变化是基本对称的:

所以我们应该先回到副切线没有被noise影响的时候,可以观察到调整参数会让高光从中间向两边延伸:

所以自然而言可以想到,在我们之前加的阈值上动手脚就好了,只要把值减小一点就会往外突出去,先来看一个周期性变化的效果吧:

float spec = StrandSpecular(T, viewDirWS, lightDirWS, _SpecularExponent, _SpecularScale);
specular = light.color.rgb * _SpecularCol.rgb * step(_Threshold-0.1*(sin(100*input.uv.x)*0.5+0.5) ,spec );

ok,看上去已经很不错了,所以我们要做的就是制作一个和0.1*(sin(100*input.uv.x)*0.5+0.5差不多的东西,先来看看这个东西的函数图像吧:

看明白这个东西那么我们要做的很简单了,而且米哈游的技术分享里有那么一张图,我想就是我现在需要的这个东东:

这个东西我查了一下,应该是unity脚本里的AnimationCurve  我做了一个曲线:

接下来就是怎么把这个值传递给shader,让shader 可以利用起来,看了这篇文章中的做法以及官方文档中的相关知识,可以试试看写一个编辑器来创建这样一个曲线图,然后在shader里采样这张图:

https://zhuanlan.zhihu.com/p/335342425

https://docs.unity3d.com/ScriptReference/EditorGUILayout.CurveField.html

float spec = StrandSpecular(T, viewDirWS, lightDirWS, _SpecularExponent, _SpecularScale);
float curve =SAMPLE_TEXTURE2D(_Curve, sampler_Curve,float2(input.uv.x,0)).r;
specular = light.color.rgb * _SpecularCol.rgb * step(_Threshold-curve ,spec );

ok,既然我自己手动调的像sin一样的函数可以成功运行,那么调一个好看一点的函数应该就好了吧,我来试试:

ok,我放弃,看来米哈游的分享里面花了几个curve是有道理的,,几个简单函数加加减减乘乘除除得到的变化应该比我手动调一个好看多了……

怎么看怎么像个捕兽器……(╯‵□′)╯︵┻━┻

就先这样吧,具体的怎么更好看一点,这都是后续问题,知道大概制作方法就好了

 

 

 


Mavis , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:实现Anisotropic Cel-shading Hair(URP)
喜欢 (3)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址