Unity Shader 龙珠Z卡通渲染分析
一、角色渲染效果整体分析角色渲染效果整体分析二、轮廓线效果三、三阶梯度漫反射四、高光一、角色渲染效果整体分析角色渲染效果整体分析
渲染效果整体截图
渲染思路分析
效果包括:轮廓线、三阶梯度漫反射、高光。
二、轮廓线效果
采用发现外扩的方式沿着法线向外扩一圈的效果,这里单独开了一个pass来渲染。
v2f vert (a2v v) {v2f o;float4 vPos = float4(UnityObjectToViewPos(v.vertex),1);float cameraDis = length(vPos.xyz);vPos.xyz +=normalize(normalize(vPos.xyz)) * v.color.b;float3 vNormal = mul((float3x3)UNITY_MATRIX_IT_MV,v.normal);float2 offset = TransformViewToProjection(vNormal).xy;offset += offset * cameraDis * v.color.g;float3 dir = normalize(v.vertex.xyz);float3 dir2 = v.normal;float D = dot(dir,dir2);dir = dir * sign(D);dir = dir * _Factor + dir2 * (1 - _Factor);v.vertex.xyz += dir * _Outline;o.pos = UnityObjectToClipPos(v.vertex);o.pos.xy += offset * _Outline * v.color.a;UNITY_TRANSFER_FOG(o, o.pos);return o;}
三、三阶梯度漫反射
角色渲染用到一共三张贴图,BaseTex基本的颜色贴图,SSSTex模拟次表面散射颜色效果贴图,ILMTex光照阴影贴图。
BaseTex控制基本贴图,SSSTex与阴影颜色相乘控制自阴影颜色,ILMTex贴图分析:R通道控制整体亮度以及高光强度,G通道控制光照阴影,B通道控制高光大小,A通道控制内部线。
三阶梯度是通过两层阴影效果以及原颜色构成,通过计算两层阴影显示的阈值来控制阴影以及原色的范围大小。
第二层阴影
float lColorG = max(floor((vrCr + color1)* 0.5 + (-_SecondShadowArea) + 1.0), 0.0);half3 _secondShadowColor = mainColor.xyz * _SecondShadowColor.rgb;fixed3 _firstShadowColor = mainColor.xyz * _FirstShadowColor.rgb;fixed3 secondShadowColor = (int(lColorG) != 0) ? _firstShadowColor.rgb * cSSS : _secondShadowColor.rgb * cSSS;
第一层阴影
float lColorGx = max(floor((i.color.r) * lightMapG + 1.5), 0.0);float2 tempXY = vrCr.rr * float2(1.20000005, 1.25) + float2(-0.100000001, -0.125);vrCr = (lColorGx != 0) ? tempXY.y : tempXY.x;vrCr = max(floor((vrCr + color1) * 0.5 + (-_FirstShadowArea) + 1.0), 0);lColorGx = int(vrCr);fixed3 firstShadowColor = (lColorGx != 0) ? mainColor.rgb : _firstShadowColor.rgb * cSSS;
内部线:将ILM贴图的A通道中的本村线乘到主颜色上。
四、高光
float lColorGy = int(max(floor(2 - spec - lightMapB), 0.0));float3 specColor = lightMapR * _LightSpecColor *_SpecIntensity * spec;specColor = (lColorGy != 0) ? float3(0.0, 0.0, 0.0) : specColor.rgb;