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;

在這裏插入圖片描述

發佈了19 篇原創文章 · 獲贊 17 · 訪問量 2405
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章