【UnityShader】游戏角色服饰染色
生活随笔
收集整理的這篇文章主要介紹了
【UnityShader】游戏角色服饰染色
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在的大部分游戲都有給角色身上的服飾染色的功能。有的是給出幾種染色的配色方案供玩家選擇,還有的是直接開發染色區域,在區域里可以自定義染色顏色。
這里用unity實現一下染色功能,主要思路就是用一張mask的四通道劃分染色的區域。
這里沒有做其他光照計算,僅做了染色的部分,材質面板:
使用代碼把材質面板接入UI操控,就可以讓玩家自定義染色的顏色了。
具體實現方案:
首先求初始顏色的luminance
inline half luminance(half3 c) {return dot(float3(0.2125, 0.7154, 0.0721), c); }然后采樣mask,mask的rgb通道分別控制三塊染色區域,a通道則負責識別染色與非染色區域:
half3 SamplerTex_Dye(sampler2D mainTex, sampler2D dyeTex, float2 uv, half4 dyeColor0, half4 dyeColor1, half4 dyeColor2) {half4 texColor = tex2D(mainTex, uv);half4 dye = tex2D(dyeTex, uv);half dyeFlag0 = dye.r * dye.a;half dyeFlag1 = dye.g * dye.a;half dyeFlag2 = dye.b * dye.a;half noChangeFlag = 1 - dye.a;half3 color0 = ComputeDyeColor(texColor.rgb, dyeColor0);half3 color1 = ComputeDyeColor(texColor.rgb, dyeColor1);half3 color2 = ComputeDyeColor(texColor.rgb, dyeColor2);return saturate(dyeFlag0*color0 + dyeFlag1*color1 + dyeFlag2*color2 + noChangeFlag*texColor.rgb); }其中dyeColor為外部控制,rgb控制染色的顏色,a控制染色的強度。
計算染色顏色的函數ComputeDyeColor:
inline half3 ComputeDyeColor(half3 c, half4 dyeColor) {half brightness = lerp(1, luminance(c), dyeColor.a);return brightness * lerp(c.rgb, dyeColor.rgb, dyeColor.a); }上圖中Unitychan染色的mask:
可以看到R通道控制袖子,G通道控制馬甲,B通道控制襪子。
注意mask圖導入Unity的時候,壓縮格式需要選擇帶A通道的,且勾上Alpha is Transparency。
Shader全部代碼:
Shader "Custom/Actor/Tex-Dye" {Properties{_MainTex ("MainTex", 2D) = "white" {}_Color ("Base Color", Color) = (1,1,1,1)_DyeTex ("Dye Tex", 2D) = "black" {}_DyeColor0 ("Dye Color 0", Color) = (1,1,1,1)_DyeColor1 ("Dye Color 1", Color) = (1,1,1,1)_DyeColor2 ("Dye Color 2", Color) = (1,1,1,1)}SubShader{Tags { "Queue"="Geometry" "RenderType"="Opaque" }LOD 200Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc" struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;};sampler2D _MainTex;float4 _MainTex_ST;half4 _Color; sampler2D _DyeTex;half4 _DyeColor0;half4 _DyeColor1;half4 _DyeColor2;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o;}inline half luminance(half3 c){return dot(float3(0.2125, 0.7154, 0.0721), c);}inline half3 ComputeDyeColor(half3 c, half4 dyeColor){half brightness = lerp(1, luminance(c), dyeColor.a);return brightness * lerp(c.rgb, dyeColor.rgb, dyeColor.a);}half3 SamplerTex_Dye(sampler2D mainTex, sampler2D dyeTex, float2 uv, half4 dyeColor0, half4 dyeColor1, half4 dyeColor2){half4 texColor = tex2D(mainTex, uv);half4 dye = tex2D(dyeTex, uv);half dyeFlag0 = dye.r * dye.a;half dyeFlag1 = dye.g * dye.a;half dyeFlag2 = dye.b * dye.a;half noChangeFlag = 1 - dye.a;half3 color0 = ComputeDyeColor(texColor.rgb, dyeColor0);half3 color1 = ComputeDyeColor(texColor.rgb, dyeColor1);half3 color2 = ComputeDyeColor(texColor.rgb, dyeColor2);return saturate(dyeFlag0*color0 + dyeFlag1*color1 + dyeFlag2*color2 + noChangeFlag*texColor.rgb);}fixed4 frag (v2f i) : SV_Target{return half4(SamplerTex_Dye(_MainTex, _DyeTex, i.uv, _DyeColor0, _DyeColor1, _DyeColor2), 1);}ENDCG}} }總結
以上是生活随笔為你收集整理的【UnityShader】游戏角色服饰染色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ulli的csslist-style属性
- 下一篇: 蓝桥杯练习——回形取数