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;

在这里插入图片描述

原创文章 24 获赞 26 访问量 7839

猜你喜欢

转载自blog.csdn.net/qq_42115447/article/details/101000200