天天看點

兩種外發光shader的比較

 首先是淺墨大大的surface shader

Shader "淺墨Shader程式設計/Volume6/32.凹凸紋理+顔色可調+邊緣光照+細節紋理"
{
Properties
{
_MainTex ("【主紋理】Texture", 2D) = "white" {}
_BumpMap ("【凹凸紋理】Bumpmap", 2D) = "bump" {}
_Detail ("【細節紋理】Detail", 2D) = "gray" {}
_ColorTint ("【色澤】Tint", Color) = (0.6, 0.3, 0.6, 0.3)
_RimColor ("【邊緣顔色】Rim Color", Color) = (0.26,0.19,0.16,0.0)
_RimPower ("【邊緣顔色強度】Rim Power", Range(0.5,8.0)) = 3.0
}
 
//--------------------------------【子着色器】----------------------------------
SubShader
{
//-----------子着色器标簽----------
Tags { "RenderType" = "Opaque" }
 
//-------------------開始CG着色器程式設計語言段-----------------
CGPROGRAM
 
//【1】光照模式聲明:使用蘭伯特光照模式+自定義顔色函數
#pragma surface surf Lambert finalcolor:setcolor
 
//【2】輸入結構
struct Input
{
//主紋理的uv值
float2 uv_MainTex;
//凹凸紋理的uv值
float2 uv_BumpMap;
//細節紋理的uv值
float2 uv_Detail;
//目前坐标的視角方向
float3 viewDir;
};
 
//變量聲明
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Detail;
fixed4 _ColorTint;
float4 _RimColor;
float _RimPower;
 
//【3】自定義顔色函數setcolor的編寫
void setcolor (Input IN, SurfaceOutput o, inout fixed4 color)
{
color *= _ColorTint;
}
 
//【4】表面着色函數的編寫
void surf (Input IN, inout SurfaceOutput o)
{
//先從主紋理擷取rgb顔色值
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
//設定細節紋理
o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb * 2;
//從凹凸紋理擷取法線值
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
//從_RimColor參數擷取自發光顔色
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
}
 
//-------------------結束CG着色器程式設計語言段------------------
ENDCG
}
 
//“備胎”為普通漫反射
Fallback "Diffuse"
}
           

這個shader的注釋非常完整  核心的外發光算法       如下  

half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
           
可以發現這個算法的核心是對輸入的坐标的視角方向進行了
           
機關向量化 <span style="font-family: Arial, Helvetica, sans-serif;">normalize</span>
           
<span style="font-family: Arial, Helvetica, sans-serif;">點乘    </span><span style="font-family: Arial, Helvetica, sans-serif;">dot</span>
           
邊緣浸透 1 - <span style="font-family: Arial, Helvetica, sans-serif;">saturate </span>
           
<span style="font-family: Arial, Helvetica, sans-serif;">這三個運算</span>
           

效果

兩種外發光shader的比較

下面的shader  (實作的輪廓光效果)

是我在cjjoy上 發現  一位做特效的朋友做的 

 應該使用了shader forge 這個插件   也使用了CG語言 結構上就比淺墨版複雜了不少 /還有一個邊緣光漸變的腳本

 下面是實作 

Shader "HZEffect/輪廓光材質Add" {
    Properties {
        _MainTex_Color ("基礎顔色", Color) = (1,1,1,1)
        _Nei_Color ("内輪廓顔色", Color) = (0.5,0.5,0.5,1)
        _Nei_Color_QiangDu ("内輪廓顔色強度", Range(0, 1)) = 0.5
        _LunKuo_QuanZhong ("輪廓權重", Range(0, 5)) = 2.5
        _Alpha_QuanZhong ("Alpha_權重", Range(0, 8)) = 4
        _All_QuanZhong ("整體權重", Range(0, 10)) = 1
        _HunHeTex ("消融通道", 2D) = "white" {}
        _XiaoRong ("XiaoRong", Range(1, 0)) = 1
        [MaterialToggle] _XRSwap ("反轉消融通道", Float ) = 0.01
        _Alpha ("Alpha", Range(1, 0)) = 1
        [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Blend SrcAlpha One
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase
            #pragma multi_compile_fog
            #pragma exclude_renderers xbox360 xboxone ps3 ps4 psp2 
            #pragma target 3.0
            uniform float4 _MainTex_Color;
            uniform float _XiaoRong;
            uniform float _Alpha;
            uniform fixed _XRSwap;
            uniform sampler2D _HunHeTex; uniform float4 _HunHeTex_ST;
            uniform float4 _Nei_Color;
            uniform float _Nei_Color_QiangDu;
            uniform float _LunKuo_QuanZhong;
            uniform float _Alpha_QuanZhong;
            uniform float _All_QuanZhong;
            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 texcoord0 : TEXCOORD0;
                float4 vertexColor : COLOR;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 posWorld : TEXCOORD1;
                float3 normalDir : TEXCOORD2;
                float4 vertexColor : COLOR;
                UNITY_FOG_COORDS(3)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.vertexColor = v.vertexColor;
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.posWorld = mul(_Object2World, v.vertex);
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex );
                UNITY_TRANSFER_FOG(o,o.pos);
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                i.normalDir = normalize(i.normalDir);
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 normalDirection = i.normalDir;
// Lighting:
// Emissive:
                float node_9887 = 1.0;
                float node_6030 = max(0,dot(node_9887,pow(1.0-max(0,dot(normalDirection, viewDirection)),node_9887)));
                float3 emissive = (((_All_QuanZhong*pow(node_6030,_LunKuo_QuanZhong)*_MainTex_Color.rgb)+(_Nei_Color.rgb*2.0*_Nei_Color_QiangDu))*i.vertexColor.rgb);
                float3 finalColor = emissive;
                float4 _HunHeTex_var = tex2D(_HunHeTex,TRANSFORM_TEX(i.uv0, _HunHeTex));
                float node_4991 = clamp(_HunHeTex_var.r,0.01,1);
                fixed4 finalRGBA = fixed4(finalColor,(i.vertexColor.a*(step(lerp( node_4991, (1.0 - node_4991), _XRSwap ),_XiaoRong)*_Alpha*(pow(node_6030,_Alpha_QuanZhong)*_All_QuanZhong))));
                UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
                return finalRGBA;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}
           

效果 

觀察shader  屬性部分 (Properties)

隻有 一張貼圖

  如果我們在淺墨shader 隻保留法線貼圖 (

_BumpMap ("【凹凸紋理】Bumpmap", 2D) = "bump" {}
           

)是否也能達到同樣效果 呢

下篇文章揭曉吧QAQ

繼續閱讀