美文网首页
Unity中二次元渲染算法总汇

Unity中二次元渲染算法总汇

作者: 游戏程序猿 | 来源:发表于2019-06-15 14:48 被阅读0次

    Unity在5.0版本升级了基于物理的着色器,能很大程度的提升游戏开发者在写实类游戏中的画面效果,可是在国内强力游戏厂商都有自己的一套特殊渲染方式,比如知名的《崩坏3》。本篇文章就总结了博毅创为教育集团在二次元渲染上的所有成就。

    1.Ramp Map

    原理,讲Dot(Normal,LightDirection)从(-1,1)的范围重映射到(0,1)之间。使用重映射的值对贴图进行采样。Shader Forge实现如图。除了在Dot(Normal,LightDirection)上可以采样,我们还可以将边缘光的值也纳入考量,这样就可以完整对一个2D贴图进行采样。

    主要使用范围。将漫反射从纯粹的黑白变化到具有风格化感觉的贴图上。

    《军团要塞2》

    使用的Ramp Map

    2.外轮廓线

    使用特殊的Pass绘制一遍物体。这个Pass不进行背面剔除而是进行正面剔除。

    ShaderForge实现

    轮廓线绘制代码

    1. Tags {

    2. "RenderType"="Opaque"

    3. }

    4. Pass {

    5. Name "Outline"

    6. Tags {

    7. }

    8. Cull Front

    9.

    10. CGPROGRAM

    11. #pragma vertex vert

    12. #pragma fragment frag

    13. #include "UnityCG.cginc"

    14. #pragma fragmentoption ARB_precision_hint_fastest

    15. #pragma target 3.0

    16. uniform float _OutLineWidth;

    17. uniform float4 _OutLineColor;

    18. struct VertexInput {

    19. float4 vertex : POSITION;

    20. float3 normal : NORMAL;

    21. };

    22. struct VertexOutput {

    23. float4 pos : SV_POSITION;

    24. };

    25. VertexOutput vert (VertexInput v) {

    26. VertexOutput o = (VertexOutput)0;

    27. o.pos = UnityObjectToClipPos( float4(v.vertex.xyz + v.normal*_OutLineWidth,1) );

    28. return o;

    29. }

    30. float4 frag(VertexOutput i) : COLOR {

    31. return fixed4(_OutLineColor.rgb,0);

    32. }

    33. ENDCG

    34. }

    粘贴到subshader即可使用

    3.边缘光RimLight

    max(0,dot(viewDir, normal))^Strength在物体边缘增加一层光效或用于对人物照明的补充。

    Shader Forge实现

    效果

    4.Tone Based Shading

    公式中α,β,Kblue,Kyellow,kd都是可调节参数。主要使用在接近插画类的渲染中,用于创建过渡自然的场景,比如《纪念碑谷》一类的

    5. 日式赛璐璐着色

    模拟日式赛璐璐画法中阴影中的色彩和普通色彩分离的一个效果。色彩分为高光部,亮部,影部三部分。

    现在资料中,GUILTY GEAR Xrd算实现得最好的。片元着色器部分伪代码如下

    dark = dot(normal,lightDir)*AO*Shadow;

    Color_shadow = Color_Light*ShadowAdjust;

    LightTerm = dark<threshlod?Color_shadow:Color_Light;

    Shadow来源于阴影贴图,Color_Light来源于底色贴图.ShadowAdjust来源于底色处于阴影环境中的调整。

    完整Color =LightTerm+Specluar;

    Specular使用标准的Blinn-phong光照模型。

    实践中会将上述所有内容整合起来完成GGXRD中的二次元渲染

    unity学习交流群可以点击加入一起交流学习 

    相关文章

      网友评论

          本文标题:Unity中二次元渲染算法总汇

          本文链接:https://www.haomeiwen.com/subject/oisbfctx.html