답변:
이 작업을 수행하는 방법은 단위에 적용 할 텍스처 맵을 기반으로합니다. 대부분의 경우 착색해야 할 영역과 그렇지 않은 영역이 있습니다. 예를 들어 일반 탱크가 있지만 일부 플래그의 색상 만 변경하려고합니다.
색상이있는 영역이 회색조 인 것처럼 텍스처를 페인트하면 알파 채널을 사용하여 색상을 지정할 영역을 지정할 수 있습니다.
따라서 셰이더에서 가장 간단한 방법으로 갈 수 있습니다.
float3 finalColor;
if (colorFromTex.a > 0)
finalColor = colorFromTex.rgb;
else
finalColor = colorFromTex.rgb*myTintColor.rgb;
전환이 힘들고 셰이더에 브랜치가 있기 때문에 최적이 아닙니다. 대신가는 것이 좋습니다 :
float3 finalColor = lerp(colorFromTex.rgb,
colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);
한 가지 기술은 각 모델에 대해 두 가지 텍스처 세트 (하나는 빨간색, 다른 하나는 파란색)를 갖는 것입니다. 그런 다음 캐릭터가 할당 된 팀에 따라 해당 텍스처 세트를 적용합니다.
분명히 두 팀이있는 경우에만 작동합니다. 두 개 이상 빠져 나갈 수는 있지만 비효율적입니다.
다른 방법은 두 가지 텍스처를 혼합하는 것입니다. 첫 번째는 모델의 기본 텍스처이고 두 번째는 런타임에 생성 할 수있는 컬러 오버레이입니다.
세 번째 방법은 기본 모델의 색상을 변경하고 팀 색상을 표시하려는 모델 부분에 텍스처 (또는 부분적으로 투명한 텍스처)가없는 것입니다.
텍스처 알파 채널을 팀 색상에 전용으로 사용하면 DXT 텍스처가 2 배 더 커지므로 크로마 키 를 사용하여 팀 색상을 계산합니다. 텍스처에서 하나의 색상 (예 : 녹색, 파랑, 마젠타)을 "예약 색상"으로 지정하십시오.
엔진이 시동되면 "예약 된 색상"을 팀 색상으로 회전시키는 각 팀 색상에 대한 매트릭스를 만듭니다. 팀 객체를 그리기 직전에이 행렬을 픽셀 셰이더 상수로 설정하십시오.
픽셀 셰이더에서 팀 색상 매트릭스로 픽셀 색상을 변환합니다. 픽셀의 채도 각도에 "예약 된 색"채도에 비례하는 양만큼 변환되지 않은 픽셀 색상을 변환 된 픽셀 색상으로 Lerp합니다.
이로 인해 ALU 명령어가 필요하고 픽셀 셰이더를 다듬어야하지만, 텍스처 캐시가 2 배 큰 텍스처 캐시를 부 풀리는 것보다 훨씬 저렴합니다.
또한 각 색상에 하나의 텍스처 채널을 할당하지 않고도 여러 크로마 키 (예 : 마젠타 및 시안이 기본 및 보조 팀 색상에 매핑 됨)를 가질 수 있습니다.
Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"
. 나는 그것을 올바르게 얻을 수있는 방법을 이해하지 못합니다.