1. 색깔별로 텍스쳐를 모두 제작
장점 : 디자이너 마음대로 색깔을 제작할 수 있으며 별다른 구현이 필요없다.
단점 : 텍스쳐 메모리를 많이 차지하고 자원관리의 효율성이 떨어짐..
디자인팀에서 텍스쳐 관리가 힘들고 유지보수하기도 힘들다 (캐릭터별로, 색깔별로 텍스쳐를 모두 제작해야하므로)
2. 폴리곤을 재질의 색으로 칠함 (Polygon Tinting)
방법 : 팀컬러가 들어가지 않는 부분과 팀컬러가 들어가는 부분으로 나누어서 렌더한다. 팀컬러가지 않는 부분은 기존의 텍스쳐를 이용하고 팀컬러가 들어갈 부분에는 재질(Diffuse Color)를 설정하여 렌더한다.
1) 재질을 흰색으로 초기화
2) 팀컬러가 들어가지 않는 부분은 기존과 같이 렌더
3) 재질(Diffuse Color)을 원하는 색으로 설정
3) 팀컬러가 들어가는 부분을 렌더
장점 : 팀컬러를 위한 별도의 텍스쳐 제작이 필요없음
단점 : 두번 Draw Call하므로써 성능저하가 일어남
팀컬러가 들어가는 부분에서(텍스쳐+팀컬러색이 동시에 한 폴리곤에서 나타나야하는 경우) 디자이너의 의도대로 표현하기 쉽지 않음
3. 멀티텍스쳐를 이용한 텍스쳐 마스킹
방법 : 알파채널을 이용하여 팀컬러가 들어가지 않는 부분과 팀컬러가 들어가는 부분으로 나누어 렌더한다 팀컬러가 들어가지 않는 부분은 텍스쳐 색으로 렌더하고, 팀컬러가 들어가는 부분은 TFACTOR 색으로 렌더한다.
장점 : 디자인팀에서 알파채널을 이용하여 마음대로 제어 가능하며, 알파채널을 이용하므로 텍스쳐가 추가로 필요하지않다
단점 : 알파채널을 마스킹하는데 이용하므로 팀색상과 투명효과를 동시에 사용할 수 없다.
4. 멀티패스를 이용한 텍스쳐 마스킹
방법 : 처음에는 그냥 렌더한다(1st-pass). 그다음에는 메쉬의 색을 원하는 색로 수정하고, 텍스쳐의 알파채널의 투명도가 존재하는 부분만 렌더한다(2nd-pass)
장점 : 멀티텍스쳐를 이용한것과 같은 장점을 가진다.
단점 : 두번 렌더되고, 그 사이에 렌더상태가 변하기 때문에 성능저하가 발생한다.
5. 픽셀쉐이더를 이용한 텍스쳐 마스킹
(생략)
구현예 : 오버라이드 컬러(Override Color)를 이용한 팀컬러

오버라이드컬러 적용하여 캐릭터 색 변경 (사용자가 임의의 색으로 설정 가능)

오버라이드컬러를 이용한 팀컬러
기존의 텍스쳐(디퓨즈텍스쳐)에서 일정영역(알파채널을 마스크로이용) 새로운 색(TFACTOR)으로 덧씌워서 렌더링하는 방식이다. 최종적인 목표로 마비노기의 염색 시스템(사용자가 옷의 원하는 부분을 원하는 색으로 염색 가능)을 고려하여 구현하였음.
![]() 디퓨즈텍스쳐 - 임의의 색과 합쳐짐 | ![]() 알파채널 - 색이 섞이지 않는 부분 |
디퓨즈텍스쳐(회색톤의 기본텍스쳐, diffuse texture)에서 알파값이 없는 부분이 팀컬러가 들어가는 부분이고 알파값이 있는 부분이 팀컬러가 없는 부분이다.
즉,디퓨즈 텍스쳐에서 알파값이 있는 부분은 '텍스쳐의 색'으로 렌더되고, 알파값이 없는 부분은 '텍스쳐의 색 + 팀컬러' 로 렌더링된다.
수식으로 써보자면
Arg1 * Alpha + (Arg1 + Arg2 - 0.5) * (1 - Alpha)
Arg1은 텍스쳐, Arg2는 팀컬러
위에서 제시한 방법중 3번 방식으로
0번 Texture state 를
COLOROP, BLENDTEXTUREALPHA
COLORARG1, TEXTURE
COLORARG2, TFACTOR
ALPHAOP, DISABLE
위와 같이 설정하였음, 수식으로는 다음과 같다
Arg1 * Alpha + Arg2 * (1 - Alpha)
이는 팀컬러가 들어가는(알파값이 없는,0인) 부분에서 디퓨즈텍스쳐의 값이 무시되고, TFACTOR컬러로 모두 채워지게 된다. 그러나 원하는 것은 알파값이 없는 부분도 디자이너에 의하여 색이 적당히 제어되는 것이다. 즉, 팀컬러가 들어가는 부분에 Photoshop의 overlay기능(layer blending option중 하나)과 같이 디퓨즈텍스쳐값과 TFACTOR를 합한 값으로 보이게 하고 싶은 것이다. 따라서 Texture Unit(Texture Stage)을 한번 더 거치든지 아니면 한번 더 렌더해주는(2-pass) 방법을 이용하여 위와같은 효과를 내려고 한다.
현재 1번 Texture Unit(Texture Stage)은 Toon Shading(음영)을 위해 사용하고 있고, 최대 사용가능 Texture Unit의 개수를 2개까지로 제한했기 때문에 위와같은 효과를 위해서 다시한번 렌더해주는 2-pass방식을 택했다. 사용가능한 Texture Unit의 개수에 제한이 없다면 2-pass보다는 Texture Unit을 한 번 더 거치는 방법이 속도가 훨씬 빠를 것이다.
1) 1st Pass (텍스쳐의 색에 TFACTOR를 더한 색을 렌더)
0번 Texture state
COLOROP, ADDSIGNED
COLORARG1, TEXTURE
COLORARG2, TFACTOR
ALPHAOP, DISABLE
1번 Texture state : 툰쉐이딩
2) 2nd Pass (텍스쳐의 알파값이 존재하는 부분을 다시 렌더)
COLOROP, SELECTARG1
COLORARG1, TEXTURE
ALPHAOP, SELECTARG1
ALPHAARG1, TEXTURE
1번째 패스에서는 알파값에 관계없이 무조건 텍스쳐색과 팀컬러를 합한 값으로 렌더한다. 알파값이 있는 부분까지 팀컬러가 더해진 색이 나오기 때문에 알파값이 있는 부분만 다시한번 원래의 텍스쳐 색으로 덮어 씌운다.
분명 더 좋은 나은 방법이 있으리라 생각되지만 일단는 이렇게 구현했다.
단계별 캐릭터 변신과정

디퓨즈텍스쳐

디퓨즈텍스쳐+오버라이드컬러

디퓨즈텍스쳐+오버라이드컬러+툰쉐이딩

디퓨즈텍스쳐+오버라이드컬러+툰쉐이딩+외곽선

디퓨즈텍스쳐+오버라이드컬러+툰쉐이딩+외곽선+그림자
Posted by hans


