最近二次元手游,卡通渲染都挺火的。虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单。
在日式卡通中,《罪恶装备》、《崩坏3》的效果都很不错,都是几年前的产品,两者的渲染方式是类似的。
这里用的是《崩坏3》的手游模型,仅是学习,侵权必删。
shader贴图
崩坏3主要用到两张贴图:albedotex ilmtex,其中ilmtex,R通道表示高光的强弱,G通道表示阴影区域,B通道控制高光区域的大小(大概)
基础模型
我们先看看崩坏3的基础模型。崩坏3模型设计,贴图配色,法线都做的很好,如果你们游戏模型效果不好,可能你们的基础模型做的比较差。
基础模型
轮廓线
轮廓线的制作方式有很多,网上都很齐全,这里就不多说了,我这里采用把backfaces方式
o.pos = UnityObjectToClipPos(v.vertex.xyz);
拓展的话,可以用模型顶点色通道控制勾边粗细,控制z-offset去掉多余勾边,效果如下
轮廓线
阴影
卡通渲染的漫反射,用的是halfLambert,然后smoothstep控制暗面与亮面的过渡平滑程度,加上ilm B通道中的阴影范围
float wrapLambert = (ndotl * 0.5 + 0.5) + ilmTex.g;
阴影
但是脸部阴影比较脏,所以我们用wrap diffuse将脸部因为halfLambert产生的阴影去掉
float wrapLambert = (ndotl * _WrapDiffuse + 1 - _WrapDiffuse) + ilmTex.g;
再加上自身阴影
float wrapLambert = (ndotl * _WrapDiffuse + 1 - _WrapDiffuse) + ilmTex.g;
阴影部分+环境光+自身贴图效果
阴影部分效果
高光
高光现在采用Blinn-Phong光照模型,再加上step 函数控制明暗
float3 halfVector = normalize(_WorldSpaceLightPos0 + viewDir);
高光
边缘光
主要用smoothstep函数风格化,再乘以光照方向
float rimDot = pow(1 - dot(viewDir, normal), _RimThreshold);
边缘光
然后整体效果加起来,如下
整体效果
整体效果
不足
头发shader,可以改为各向异性shader
高光部分,如果我做的话,还是考虑用金属度,粗糙度贴图,再风格化高光
皮肤部分,加上sss效果,例如用PreIntergated贴图渲染
附上全部代码
Shader "Custom/ToonShader"
往期精选
Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着
声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。
作者:LN0017
来源:https://zhuanlan.zhihu.com/p/140458348
More:【微信公众号】_ _u3dnotes
本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。