天天看点

两种外发光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

继续阅读