卡通效果

最近公司要啟動新項(xiàng)目屋讶,所以研究了一下卡通渲染,參考崩壞3與罪惡裝備的效果


效果圖.jpg
材質(zhì)面板.jpg

通過backface做的輪廓描邊蛇券,接著使用繪制的輪廓內(nèi)貼圖通過調(diào)整UV的方式呈現(xiàn)囱淋,原因是為了防止馬賽克的出現(xiàn)


輪廓內(nèi)描線圖.jpg

UV調(diào)整圖.jpg

陰影是通過陰影圖加定點(diǎn)顏色來控制猪杭,比較靈活,頂點(diǎn)顏色甚至可以使用Unity來繪制


陰影圖.jpg

以下是代碼分享:

Shader "BaseTest" {
    Properties {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
        _Darken ("Darken Color", Color) = (1, 1, 1, 1)
        _RimPower ("RimPower", Range(-1, 10)) = 0
        _MainTex ("Main Tex", 2D) = "white" {}
        _DarkenInnerLineColor("Darken Inner Line Color", Range(0, 1)) = 0.2
        _ILMTex("ILM (RGB)", 2D) = "white" {}
        _Outline("Outline Width", Range(.0, 2)) = .5
        _LightMap ("LightMap", 2D) = "white" {}
        _LightArea ("LightArea", Range(-1, 1)) = 0
        _LightArea1 ("LightArea1", Range(-1, 1)) = 0
        _SecondShadow ("SecondShadow", Range(-1, 1)) = 0
        _OutlineCol("OutlineCol", Color) = (1,0,0,1)
        _FirstShadowMultColor("FirstShadowMultColor", Color) = (1,1,1,1)
        _SecondShadowMultColor("SecondShadowMultColor", Color) = (1,1,1,1)
        _Shininess("Shininess", Range(0, 256)) = 0
        _LightSpecColor("LightSpecColor", Color) = (1, 1, 1, 1)
        _SpecMulti("SpecMulti", Range(0, 256)) = 0
    }
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry"}
        
        Pass { 
            Tags { "LightMode"="ForwardBase" }
            Cull Front
            offset 1,1
        
            CGPROGRAM
            
            #pragma multi_compile_fwdbase   
            
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"
            
            
            uniform float _Outline;
    
            fixed4 _OutlineCol;
        
            struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                
            };
            
            struct v2f {
                float4 pos : SV_POSITION;
            
            
            };
            
            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
             
                float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
                float2 offset = TransformViewToProjection(norm.xy);
                o.pos.xy += offset * _Outline * 0.5 ;
                
                return o;
            }
            
            fixed4 frag(v2f i) : SV_Target {
                                            
                return _OutlineCol;
                
            }
            
            ENDCG
        }

        Pass{
        
            Tags { "LightMode"="ForwardBase" }
            Cull Back
            
            
            CGPROGRAM
            
            #pragma multi_compile_fwdbase   
            
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"
            
            uniform float _Outline;
            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            //fixed4 _Specular;
            float _Shininess;
            sampler2D _LightMap;
            sampler2D _ILMTex;
            float _LightArea;
            fixed4 _FirstShadowMultColor;
            fixed4 _SecondShadowMultColor;
            uniform float _DarkenInnerLineColor;
            float _SecondShadow;
            float _RimPower;
            fixed4 _Darken;
            float _LightArea1;
            fixed4 _LightSpecColor;
            float _SpecMulti;
            struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
                float4 color : COLOR;
            };
            
            struct v2f {
                float4 pos : SV_POSITION;
                float4 uv : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float3 worldNormal :  TEXCOORD2; 
                float4 color : COLOR;
                SHADOW_COORDS(5)
            };
            
            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
             
                o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                        
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;  
                
                o.worldNormal = UnityObjectToWorldNormal(v.normal);  

                o.color = v.color;
                                            
                TRANSFER_SHADOW(o);
                
                return o;
            }
            
            fixed4 frag(v2f i) : SV_Target {
                
                fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                            
                
                fixed3 albedo = tex2D(_MainTex, i.uv.xy).rgb * _Color.rgb;
                fixed4 cILM = tex2D(_ILMTex, i.uv.xy);
                float clampedLineColor = cILM.a;
                if (clampedLineColor < _DarkenInnerLineColor)
                clampedLineColor = _DarkenInnerLineColor; 
                half3 InnerLineColor = half3(clampedLineColor,clampedLineColor,clampedLineColor);
                float rim = max(0, dot(viewDir, i.worldNormal));
                fixed3 rimColor = _Darken * pow(rim, 1 / _RimPower);
                rimColor*=1-InnerLineColor;
                rimColor = 1-rimColor;
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
                fixed3 lightMapColor = tex2D(_LightMap, i.uv.xy).rgb;
                fixed mask = lightMapColor.r * i.color.r;
                half halfLambert = max(0, dot( i.worldNormal, lightDir))*0.5+0.5;
                    mask  += saturate(halfLambert);
                    mask  = mask *0.5 +(-_LightArea) + 1;
                int lightStep = step(1,mask);  //1>mask  1 : 0
                    
                    fixed3 firstShadow = albedo.xyz * _FirstShadowMultColor.rgb;
                    if(lightStep!=0)//1>mask用固有色
                        firstShadow = albedo.xyz;
                    else            //1<mask用陰影
                        firstShadow = firstShadow ; 
                fixed3 secondShadow = albedo.xyz * _SecondShadowMultColor.rgb;
                fixed secMask = i.color.r * lightMapColor.y + saturate(halfLambert);
                    secMask = secMask *0.5 + (-_SecondShadow)+1;
                    lightStep = step(1, secMask);
                    if(lightStep !=0)
                        secondShadow= albedo.xyz;
                    else
                        secondShadow= secondShadow;

                fixed sep = i.color.r * lightMapColor.y + _LightArea1;
                int sepMask = step(1,sep);
                fixed3 finalColor;
                if(sepMask != 0)  //1>mask   1:0
                    finalColor= firstShadow;
                else              //1<mask
                     finalColor= secondShadow;
                //fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(bump, lightDir));
                
                //fixed3 halfDir = normalize(lightDir + viewDir);
                //fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(bump, halfDir)), _Gloss);
                
                
                float3 halfView =  normalize(viewDir + normalize(_WorldSpaceLightPos0.xyz));
                
                float shinPow = pow(max(dot(normalize(i.worldNormal.xyz), halfView), 0), _Shininess);
                float oneMinusSpec = 1 - lightMapColor.z;
                oneMinusSpec = oneMinusSpec - shinPow;
                int specMaslk = step(0,oneMinusSpec);
                fixed3 specColor = _SpecMulti * _LightSpecColor.xyz;
                specColor = lightMapColor.x * specColor;
                if(specMaslk!=0)
                     specColor = 0;
                else
                     specColor = specColor;
                UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
                //return fixed4( albedo /** InnerLineColor *//*+finalColor*/, 1.0);
                //return fixed4( albedo*(1-rimColor)+finalColor, 1.0);
                return fixed4( (albedo * rimColor +finalColor  )/2 + specColor, 1.0);
                //return fixed4(ambient + (diffuse + specular) * atten /*+ reflectColor*/, 1.0);
            }   
            ENDCG   
        }
        }
        }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绎橘,一起剝皮案震驚了整個濱河市胁孙,隨后出現(xiàn)的幾起案子唠倦,更是在濱河造成了極大的恐慌称鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠鼻,死亡現(xiàn)場離奇詭異冈止,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)候齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門熙暴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慌盯,你說我怎么就攤上這事周霉。” “怎么了亚皂?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵俱箱,是天一觀的道長。 經(jīng)常有香客問我灭必,道長狞谱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任禁漓,我火速辦了婚禮跟衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘播歼。我一直安慰自己伶跷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叭莫,像睡著了一般磷支。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食寡,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天雾狈,我揣著相機(jī)與錄音,去河邊找鬼抵皱。 笑死善榛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呻畸。 我是一名探鬼主播移盆,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伤为!你這毒婦竟也來了咒循?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绞愚,失蹤者是張志新(化名)和其女友劉穎叙甸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體位衩,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裆蒸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糖驴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僚祷。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贮缕,靈堂內(nèi)的尸體忽然破棺而出辙谜,到底是詐尸還是另有隱情,我是刑警寧澤感昼,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布装哆,位于F島的核電站,受9級特大地震影響抑诸,放射性物質(zhì)發(fā)生泄漏烂琴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一蜕乡、第九天 我趴在偏房一處隱蔽的房頂上張望奸绷。 院中可真熱鬧,春花似錦层玲、人聲如沸号醉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔派。三九已至铅碍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間线椰,已是汗流浹背胞谈。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憨愉,地道東北人烦绳。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像配紫,于是被迫代替她去往敵國和親径密。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容