转自:https://www.element3ds.com/thread-151972-1-1.html
Guilty Gear Xrd的日漫风shader一直被看作是业内这方面的标杆。几年前看了GGX的制作人在GDC上讲他们的shader,我当时出于好奇就研究了一下日本的卡通shader。
GDC视频链接:https://www.youtube.com/watch?v=yhGjCzxJV3E
先放张我在UE4里的还原图(模型是游戏里的,我只是做了material)。
我的实验(UE4)
原作中的模型渲染效果(UE3)
一、贴图和轮廓线
左上为影贴图,右下为通常色贴图
通常色贴图:Diffuse,除眼睛外全为颜色平涂
影贴图(日漫shader独有,分一影色/二影色/等):GGX只有一影色贴图,开发者称其为SSS贴图,假次表面贴图,其代表的是暗部的色彩倾向,能够计算出某种材质被光透过的程度。通常使暗部皮肤偏红,衣料等偏蓝紫。在GGX中,阴部位的颜色通过SSS的信息和环境光信息做乘法得到。
通常色贴图:Diffuse,除眼睛外全为颜色平涂
影贴图(日漫shader独有,分一影色/二影色/等):GGX只有一影色贴图,开发者称其为SSS贴图,假次表面贴图,其代表的是暗部的色彩倾向,能够计算出某种材质被光透过的程度。通常使暗部皮肤偏红,衣料等偏蓝紫。在GGX中,阴部位的颜色通过SSS的信息和环境光信息做乘法得到。
ILM贴图
ILM贴图:
ILM贴图:
R通道
R通道:高光的进入倾向。金属和光滑部位的值稍大。影响高光的颜色。
G通道
G通道:影的倾向权重,假AO,下巴内侧、头和下巴结合处等。此阴影不受物理光影响。
B通道
B通道:高光的强度,与fresnel(本身须计算得出)的强度对比来决定。fresnel值越大,高光越强。影响高光的形状。
左图为a通道,右图为本村式线
通过本村线来调整模型上线的粗细
a通道:物体内部的线条。GGX贴图采用独特的uv分布方式(本村式线),其原理在于用垂直的黑线来表示内部黑线,从而防止45度线导致的近视角线段锯齿情况的发生。
“请务必记住本村式线这个概念,后面会讲到”
GGX里的高光是要用非物理思维去理解的。在日漫中,不论是高光还是阴影要表现的都不是物理光的模拟,而是形体和材质的塑造。高光在日漫里出现在形状凹凸明显和材质发生改变的边缘地带。
物体外部线条通常用backface culling/hull shader的方法做,GGX用了vertex painting的方法使外部线条可以有粗细变化。
GGX中vertex color的应用:
R通道:判断阴影的阈值对应的Offset。1是标准,越倾向变成影子的部分也会越暗(接近0),0的话一定是影子。ILM里G通道(AO)的遮罩率系数。
G通道:对应到Camera的距离,轮廓线的在哪个范围膨胀的系数
B通道:轮廓线的Z Offset 值。背面膨胀在z轴(远近轴)上的系数。
a通道:轮廓线的粗细系数。0.5是标准,1是最粗,0的话就没有轮廓线。
可以看出。R,B通道控制轮廓线的有无;G,a通道控制轮廓线的粗细。
二、Softimage流程,顶点法线与影子
左图为一般形式的法线,右图为3DCG流程中调整过后的法线
面部:通过美术的手调产出满足多角度观看的美观阴影分布。要用到XSI(Softimage)的插件User Normal Translator。为了方便观看效果,需用cgfx语言做出实时shader,与ue蓝图效果一致。
除脸部的其他部位:用Maya做出简单几何体,Mesh>Transfer Attributes,enable only vertex normals,将顶点法线信息转移至目标部件上。
影子:美观的阴影用简化的模型替代原模型影子得到。
三、UE4中的设置
面部:通过美术的手调产出满足多角度观看的美观阴影分布。要用到XSI(Softimage)的插件User Normal Translator。为了方便观看效果,需用cgfx语言做出实时shader,与ue蓝图效果一致。
除脸部的其他部位:用Maya做出简单几何体,Mesh>Transfer Attributes,enable only vertex normals,将顶点法线信息转移至目标部件上。
影子:美观的阴影用简化的模型替代原模型影子得到。
三、UE4中的设置
GGX shader
模型构成:
模型组:主模型(unlit),轮廓线模型(有更多方法做轮廓线),影子模型
材质构成:
GGX shader,轮廓线,发光物体,Logo
模型构成:
模型组:主模型(unlit),轮廓线模型(有更多方法做轮廓线),影子模型
材质构成:
GGX shader,轮廓线,发光物体,Logo
collection parameter在蓝图中的设置
光:UE4和UE3的光照系统变化很大,其实光向量在UE4中很好自定义。做一个collection parameter,把你要的光向量放进去就行了。
四、GGX流程中的UV和Logo
光:UE4和UE3的光照系统变化很大,其实光向量在UE4中很好自定义。做一个collection parameter,把你要的光向量放进去就行了。
四、GGX流程中的UV和Logo
3DCG流程中,模型的UV一般都很难看(不仅GGX是这样,塞尔达也这样)
下方的UV shell为了抗锯齿用到了本村氏线的做法挤压成了上方这样的方块
当时制作本村氏线的UV要花很大的精力,然而我最近看到Maya 2018出了个新功能,叫做Straighten UV,可以一键把UV上的顶点排在一条直线上。这个功能美国PBR流程用来展头发的UV,日本3DCG看来是要用到制作本村线上了。
logo
六、总结
我看了U3D日本峰会上关于卡通shader的讲座,感觉和GGX在思路上基本一致。日式卡通shader对美术要求高,对技术要求低。在搭建shader制作流程的时候,首先想到的是画法(囧rz)。然后把画法解构成配色,影和轮廓线。
GGX对这三者的处理有自己的思路,其中本村氏线是GGX所独创。由于是格斗类游戏,会出现大量特写镜头,抗锯齿的轮廓线发挥了决定性的作用。
最后分享一些能代表日本3DCG制作思路的图。3DCG的制作思路就是我2D怎么画我3D就怎么做... 其实就是这么回事。
值得一提的是,logo和发光材质是通过额外的两张贴图来表现的,由于不是按照本村线UV来制作logo,所以logo是不抗锯齿的。所以本村线这个技术本身是有局限性并且费时费力的。
五、和崩坏3的比较
现在来看看崩坏3是怎么借鉴GGX的shader制作法的。
崩坏3的身体部分把假AO和线条信息(GGX里的G通道和a通道)合在了一起放入G通道
崩坏3也没有用本村氏线的办法展UV,ILM贴图中没有a通道,只有RGB通道
LM贴图:左图是脸部,中图是头发,右图是身体
脸部的Diffuse贴图
崩坏3没有影贴图,而是在DIffuse贴图上直接画上了阴影,让下颚和耳朵内部等部位在任何情况下都要暗一些。面部的假AO在细节上比身体部位丰富很多。头发因为材质一样,所以没有R通道,但假AO和高光进入信息都是有的。
六、总结
我看了U3D日本峰会上关于卡通shader的讲座,感觉和GGX在思路上基本一致。日式卡通shader对美术要求高,对技术要求低。在搭建shader制作流程的时候,首先想到的是画法(囧rz)。然后把画法解构成配色,影和轮廓线。
GGX对这三者的处理有自己的思路,其中本村氏线是GGX所独创。由于是格斗类游戏,会出现大量特写镜头,抗锯齿的轮廓线发挥了决定性的作用。
最后分享一些能代表日本3DCG制作思路的图。3DCG的制作思路就是我2D怎么画我3D就怎么做... 其实就是这么回事。
日本人对分层渲染的理解...就是分层上色
日本人对shader的理解,流程步骤的不同取决于画法的不同...
不存在高端的算法,一个内积就够用了
转自:https://forums.unrealengine.com/community/work-in-progress/96766-guilty-gear-xrd-shader-playground
Guilty Gear XRD Shader playground.
Sure, they are fairly simple.
First the cel shader which is applied to the mesh. The light direction is just a directional light with the forward vector passed in through a material parameter. The material is Surface / Opaque / Unlit
First the cel shader which is applied to the mesh. The light direction is just a directional light with the forward vector passed in through a material parameter. The material is Surface / Opaque / Unlit
Then the inverted hull shader is a surface, masked, unlit two sided.
Even more progress has been made! I (think) I figured out what the extra data I had was used for and put it to work.... I believe it's correct because it looks even better now. She now has weighted shading on individual parts, so some things that are occluded (like under her dress or her shoes) have a higher tendency to be shaded than not. Specularity has been sorted out as well, so now she has specular highlights across some pieces as well. Toned back the outline shader and brightened it up so it's not as black, smoothed the inner line rendering as well... no more nasty filtering. If the camera gets too far away, the lines are too small to render. Not quite sure how to deal with that one just yet, but it may just involve increasing the line width based on camera distance, or super sampling the scene.
Overall I think I'm pretty happy with the appearance now. Up next is trying to fix her buckles... I translated the bones closer to her body in the skeletal mesh file and when I preview animations there, they are correct, but out in the game world they go back to their pre-translation state. I may have to just translate them on beginplay which is gross but doable. Deciding if I want to maybe do another character next (like Ramlethal) or continue with this one and try to get her weapons and more game like animations.
Overall I think I'm pretty happy with the appearance now. Up next is trying to fix her buckles... I translated the bones closer to her body in the skeletal mesh file and when I preview animations there, they are correct, but out in the game world they go back to their pre-translation state. I may have to just translate them on beginplay which is gross but doable. Deciding if I want to maybe do another character next (like Ramlethal) or continue with this one and try to get her weapons and more game like animations.