Відповіді:
Як я це зробив би, базується на картах текстур, які ви застосовуєте до одиниць. Для більшості матеріалів у вас є деякі регіони, які потрібно підфарбувати, а деякі - ні. Так, наприклад, у вас може бути звичайний танк, але ви хочете просто змінити колір деяких прапорів.
Якщо ви фарбуєте текстуру так, ніби кольорові ділянки мають відтінки сірого, ви можете використовувати альфа-канал, щоб визначити, які регіони потрібно забарвити.
Тож у своєму шейдері ви могли пройти (найпростішим шляхом):
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 рази більшими, тому я б скоріше скористався клавішею кольоровості для обчислення кольору команди. Позначте один колір (наприклад, зелений, синій, пурпуровий) як "зарезервований колір" у ваших текстурах.
Коли двигун завантажується, зробіть матрицю для кожного кольору команди, який обертає "зарезервований колір" на командний колір. Перед тим, як намалювати командний об'єкт, встановіть цю матрицю як константу пікселя.
У піксельному шейдері перетворіть колір пікселів за командною кольоровою матрицею. Розріжте непроформований колір пікселя з перетвореним кольором пікселів на величину, пропорційну куту кольоровості пікселя та кольоровості "зарезервованого кольору".
Це коштуватиме вам декількох інструкцій ALU та активації в піксельній шейдері, але це набагато дешевше, ніж роздуття кеш текстури з текстурами в 2 рази більше.
Також у вас є можливість мати декілька кольорових клавіш (наприклад, пурпуровий та блакитний кольори, відображені на основний та вторинний кольоровий колір), не присвячуючи одному каналу текстури для кожного кольору.
Моя техніка: 2 текстури: одна основна текстура, одна друга текстура, яка накладає основні, але лише ті частини, які ви хочете забарвити. Змініть колір другої текстури, як хочете.
Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"
. Я не розумію, як я можу це зробити правильно.