首先是淺墨大大的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 (實作的輪廓光效果)
是我在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