게임

유니티 Spine 셰이더 고쳐서 부위별 Hue-Shift 적용시키기

by 조루나 posted Mar 10, 2022
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄


Honeycam 2022-03-10 12-12-24.gif1.5 MB

 

원래는 스파인의 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

 

나는 아직 셰이더질은 제대로 못 한다네~

 


엮인글


Articles

1 2 3