원래는 스파인의 Slot별 SetColor()가 유니티 기본 사양 컬러 블렌딩인 Multiply로 동작한다.
하지만 Hue-Shift 스타일 색상 변경을 원하는 관계로 셰이더를 고쳐서 써야했다.
Spine URP 셰이더 패키지의 Shaders/include/Spine-Sprite-ForwardPass-URP.hlsl 파일에서
LightweightFragmentBlinnPhongSimplified 함수의
half4 diffuse = texDiffuseAlpha * vertexColor; 이 부분이 텍스쳐의 기본 색상과 염색 색상을 Multiply 하고 있길래
half4 diffuse = adjustHueOfColor(texDiffuseAlpha, vertexColor); 요렇게 수정하고
그 위에다가 아래의 함수들을 추가해 주었다.
float3 rgb2hsv(float3 c)
{
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
float3 hsv2rgb(float3 c)
{
c = float3(c.x, clamp(c.yz, 0.0, 1.0));
float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}
inline half4 adjustHueOfColor(half4 color, half4 _value)
{
float3 hsv = rgb2hsv(color.rgb);
//hsv.x = _value.x; // sets it to the target hue
hsv.x += _value.x; // or use this line instead to add a hue-shift to it
hsv.y *= _value.y;
hsv.z *= _value.z;
color.rgb = hsv2rgb(hsv);
return color;
}
물론 내가 한 건 별로 없고 스파인 개발자가 대부분 알려줌
http://ko.esotericsoftware.com/forum/Slot-SetColor-in-different-blend-mode-17216?p=75550#p75550
나는 아직 셰이더질은 제대로 못 한다네~