Unity中二次元渲染算法總匯
Unity在5.0版本升級(jí)了基于物理的著色器,能很大程度的提升游戲開發(fā)者在寫實(shí)類游戲中的畫面效果,可是在國(guó)內(nèi)強(qiáng)力游戲廠商都有自己的一套特殊渲染方式,比如知名的《崩壞3》。本篇文章就總結(jié)了博毅創(chuàng)為教育集團(tuán)在二次元渲染上的所有成就。
1.Ramp Map
原理,講Dot(Normal,LightDirection)從(-1,1)的范圍重映射到(0,1)之間。使用重映射的值對(duì)貼圖進(jìn)行采樣。Shader Forge實(shí)現(xiàn)如圖。除了在Dot(Normal,LightDirection)上可以采樣,我們還可以將邊緣光的值也納入考量,這樣就可以完整對(duì)一個(gè)2D貼圖進(jìn)行采樣。

主要使用范圍。將漫反射從純粹的黑白變化到具有風(fēng)格化感覺的貼圖上。


《軍團(tuán)要塞2》
使用的Ramp Map

2.外輪廓線
使用特殊的Pass繪制一遍物體。這個(gè)Pass不進(jìn)行背面剔除而是進(jìn)行正面剔除。
ShaderForge實(shí)現(xiàn)

輪廓線繪制代碼
Tags {
"RenderType"="Opaque"
}
Pass {
Name "Outline"
Tags {
}
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
uniform float _OutLineWidth;
uniform float4 _OutLineColor;
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct VertexOutput {
float4 pos : SV_POSITION;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( float4(v.vertex.xyz + v.normal*_OutLineWidth,1) );
return o;
}
float4 frag(VertexOutput i) : COLOR {
return fixed4(_OutLineColor.rgb,0);
}
ENDCG
}
粘貼到subshader即可使用。
3.邊緣光RimLight
max(0,dot(viewDir, normal))^Strength在物體邊緣增加一層光效或用于對(duì)人物照明的補(bǔ)充。
Shader Forge實(shí)現(xiàn)

效果

4.Tone Based Shading



公式中α,β,Kblue,Kyellow,kd都是可調(diào)節(jié)參數(shù)。主要使用在
接近插畫類的渲染中,用于創(chuàng)建過渡自然的場(chǎng)景,比如《紀(jì)念碑谷》一類的


模擬日式賽璐璐畫法中陰影中的色彩和普通色彩分離的一個(gè)效果。色彩分為高光部,亮部,影部三部分。

現(xiàn)在資料中,GUILTY GEAR Xrd算實(shí)現(xiàn)得最好的。片元著色器部分偽代碼如下
dark = dot(normal,lightDir)*AO*Shadow;
Color_shadow = Color_Light*ShadowAdjust;
LightTerm = dark<threshlod?Color_shadow:Color_Light;
Shadow來源于陰影貼圖,Color_Light來源于底色貼圖.ShadowAdjust來源于底色處于陰影環(huán)境中的調(diào)整。
完整Color =LightTerm+Specluar;
Specular使用標(biāo)準(zhǔn)的Blinn-phong光照模型。
博毅創(chuàng)為VIP課程實(shí)踐中會(huì)將上述所有內(nèi)容整合起來完成GGXRD中的二次元渲染

更多課程資源請(qǐng)點(diǎn)擊:
https://bycwedu.vipwan.cn/promotion_channels/630597732