前言
今天要向大家推薦的是 UnityFurShader,一款【開源】、【專為 Unity 引擎設計】的【毛髮】、【絨毛】、【皮毛】渲染著色器。
這個插件能讓開發者在原生 Shader 中以分層方式繪製毛髮質感,加入【光照計算】與【外力調整】,提升材質的【細節】與【立體感】。
雖然不是完整的物理模擬系統,但在【靜態】或【半動態】場景中已經能呈現相當不錯的視覺效果。
無論你要做【動物角色的皮毛】、【絨毛玩偶的濃密質感】,或是場景中飄動的絨毛植物,UnityFurShader 都是一個【輕量】、【直觀】的選擇。

Unity UnityFurShader 插件介紹
UnityFurShader 是由 Sorumi 開發的開源著色器,核心原理是透過多層 Pass 技術 在模型表面堆疊毛髮層,營造出立體的【毛髮厚度】與【光影效果】。
它結合了基本的光照模型,包括【環境光】、【漫反射】與【鏡面反射】,讓毛髮在不同光源下呈現自然變化。
插件同時提供了屬性控制,例如毛髮【密度】、【細度】與【陰影深度】,開發者能依需求快速調整。
搭配外力 (Force) 模組,毛髮能夠因【全域】或【局部】偏移而展現出簡單的動態效果;最後藉由 Rim Color 邊緣顏色的設計,毛髮在迎光處更具層次感。
需要注意的是,UnityFurShader 僅支援內置渲染管線 (Built-in RP),對於【URP】與【HDRP】並沒有完整支援。

功能特色
- 分層毛髮渲染 (Layered / Multi-pass)
利用多個 Pass 或多層插值,在模型表面和外沿生成不同深度的毛髮層,創造出毛髮的厚度感與層次感。sorumi.xyz+1 - 光照模型整合 (Ambient / Diffuse / Specular)
在每個 fragment 中計算基本的環境光、漫反射和鏡面反射,使毛髮在光照下有明暗變化。sorumi.xyz - 屬性控制 (Density, Thinness, Shading)
可調整毛髮強度 (density)、毛髮的細度 (thinness)、陰影深淺(根部 vs 尖端)等。sorumi.xyz
適用場景
- 【動物】或【生物】的皮毛
用於表現【狼】、【貓】、【狐】、【熊】等毛皮角色,使其毛髮具【層次感】與【光照細節】。 - 絨毛 / 布偶 / 虹吸材質
適合在模型表面需要呈現【蓬鬆】或【柔軟】質感時使用,例如【玩偶公仔】、【毛毯】、【絨毛抱枕】或【布偶服飾】,帶來細膩的觸感表現。 - 【靜態】或【半靜態】場景物件
在場景中如果有些【毛髮】或【絨毛】物件不需要非常複雜的動態物理互動,只要有輕微偏移變化效果,就能用這個插件。

Unity UnityFurShader 內建渲染管線
支援幾隻著色器

Basic 基本
具有環境光、漫反射和鏡面反射的基本毛髮著色器。

Shader “Fur/FurBasicShader”
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
_Specular ("Specular", Color) = (0, 0, 0, 1)
_Shininess ("Shininess", Range(0.01, 128.0)) = 8.0
_MainTex ("Texture", 2D) = "white" { }
_FurTex ("Fur Pattern", 2D) = "white" { }
_FurLength ("Fur Length", Range(0.0, 1)) = 0.5
}
Category
{
Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_surface
#pragma fragment frag_surface
#define FURSTEP 0.00
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.05
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.10
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.15
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.20
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.25
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.30
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.35
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.40
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.45
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.50
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.55
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.60
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.65
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.70
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.75
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.80
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.85
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.90
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.95
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 1.00
#include “FurHelper.cginc”
ENDCG
}
}
}
}
Attributes 屬性
新增毛髮屬性:密度、薄度、著色。

Shader “Fur/FurAttributesShader”
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
_Specular ("Specular", Color) = (1, 1, 1, 1)
_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0
_MainTex ("Texture", 2D) = "white" { }
_FurTex ("Fur Pattern", 2D) = "white" { }
_FurLength ("Fur Length", Range(0.0, 1)) = 0.5
_FurDensity ("Fur Density", Range(0, 2)) = 0.11
_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1
_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25
}
Category
{
Tags { "RenderType" = "Transparent" "IgnoreProjector" = “True”"Queue" = "Transparent" }
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_surface
#pragma fragment frag_surface
#define FURSTEP 0.00
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.05
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.10
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.15
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.20
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.25
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.30
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.35
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.40
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.45
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.50
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.55
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.60
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.65
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.70
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.75
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.80
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.85
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.90
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.95
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 1.00
#include “FurHelper.cginc”
ENDCG
}
}
}
}
Force 力
加力:全局力和局部力。

Shader “Fur/FurForceShader”
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
_Specular ("Specular", Color) = (1, 1, 1, 1)
_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0
_MainTex ("Texture", 2D) = "white" { }
_FurTex ("Fur Pattern", 2D) = "white" { }
_FurLength ("Fur Length", Range(0.0, 1)) = 0.5
_FurDensity ("Fur Density", Range(0, 2)) = 0.11
_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1
_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25
_ForceGlobal ("Force Global", Vector) = (0, 0, 0, 0)
_ForceLocal ("Force Local", Vector) = (0, 0, 0, 0)
}
Category
{
Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_surface
#pragma fragment frag_surface
#define FURSTEP 0.00
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.05
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.10
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.15
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.20
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.25
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.30
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.35
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.40
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.45
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.50
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.55
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.60
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.65
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.70
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.75
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.80
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.85
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.90
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.95
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 1.00
#include “FurHelper.cginc”
ENDCG
}
}
}
}
Rim Color 輪圈顏色
Add rim color 添加邊緣顏色。

Shader “Fur/FurRimColorShader”
{
Properties
{
_Color ("Color", Color) = (1, 1, 1, 1)
_Specular ("Specular", Color) = (1, 1, 1, 1)
_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0
_MainTex ("Texture", 2D) = "white" { }
_FurTex ("Fur Pattern", 2D) = "white" { }
_FurLength ("Fur Length", Range(0.0, 1)) = 0.5
_FurDensity ("Fur Density", Range(0, 2)) = 0.11
_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1
_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25
_ForceGlobal ("Force Global", Vector) = (0, 0, 0, 0)
_ForceLocal ("Force Local", Vector) = (0, 0, 0, 0)
_RimColor ("Rim Color", Color) = (0, 0, 0, 1)
_RimPower ("Rim Power", Range(0.0, 8.0)) = 6.0
}
Category
{
Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }
Cull Off
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_surface
#pragma fragment frag_surface
#define FURSTEP 0.00
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.05
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.10
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.15
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.20
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.25
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.30
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.35
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.40
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.45
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.50
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.55
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.60
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.65
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.70
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.75
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.80
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.85
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.90
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 0.95
#include “FurHelper.cginc”
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex vert_base
#pragma fragment frag_base
#define FURSTEP 1.00
#include “FurHelper.cginc”
ENDCG
}
}
}
}
Unity UnityFurShader URP
下載
Github 網址:UnityFurShader
幾個毛髮著色器實現的範例
這是通用渲染管道中毛髮著色器實現的範例。
它包括以下功能:
- 3 種方法(殼/鰭/毛髮多邊形)(Shell / Fin / Fur Polygon)
- 1 使用幾何著色器(和Fin的細分)的通道
- Lit / Unlit 點亮/未點亮
- 使用法線貼圖進行照明計算
- 邊緣光照
- 動畫動作
Shell 殼

Fin 翅片

Fur Polygon 毛髮多邊形

Compare 比較

Move 移動


Unity UnityFurShader 網格合併大師相關網站 & 插件下載點
【UnityFurShader】
插件作者部落格:UnityFurShader
Github 網址:UnityFurShader
————————————————
更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!
本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。
特約作家簡介
支持贊助 / DONATE
亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。
BTC |
![]() |
bc1psp8nnerlepv56nyfha6mqwnp3yr7qqjdw44c6qt5lx5r2urma7fqykxvwj |
|
ETH |
![]() |
0xB2231557bc418201922DD7C2673ec97E67E35F83 |
|
TRON |
![]() |
TAomNj4L6vMJuaJmbWUdmT1uAWYPf9vDjp |








