Як розфарбувати певні частини моделі - наприклад, ігри RTS мають ці командні кольори?


16

Мені потрібно реалізувати щось, що ми бачимо в іграх RTS: командні кольори. В основному я шукаю спосіб розфарбувати певні частини моделі. Як би я досяг цього? Я поняття не маю, з чого навіть почати. Чи потрібно спочатку внести деякі корективи в 3d-модель?

Відповіді:


18

Як я це зробив би, базується на картах текстур, які ви застосовуєте до одиниць. Для більшості матеріалів у вас є деякі регіони, які потрібно підфарбувати, а деякі - ні. Так, наприклад, у вас може бути звичайний танк, але ви хочете просто змінити колір деяких прапорів.

Якщо ви фарбуєте текстуру так, ніби кольорові ділянки мають відтінки сірого, ви можете використовувати альфа-канал, щоб визначити, які регіони потрібно забарвити.

Тож у своєму шейдері ви могли пройти (найпростішим шляхом):

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);

Чи знаєте ви, як дістати шейдер DirectX до 3d-моделей у 3ds Max? Коли я спробував встановити матеріал із типом шейдера та встановив шейдер на ReplaceColor.fx та експортував модель, результат був Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". Я не розумію, як я можу це зробити правильно.
rFactor

Це коли ви завантажуєте його? Дивно здається, що шлях у FBX вказував би на тимчасову папку. Чи існує цей файл? Я не дуже знайомий з експортом FBX з 3ds Max, але, можливо, вам потрібно відредагувати файли (або встановити параметр), щоб зробити шляхи відносними.
Лукас

Хороша техніка, але якщо ви використовуєте альфа-канал для позначення «відчутності», не забудьте скинути альфа-компонент у остаточному кольорі.
charstar

3

Одна техніка - мати два набори текстур для кожної моделі - один червоний, другий синій. Тоді залежно від того, якій команді призначений персонаж, ви застосуєте цей набір текстур.

Очевидно, це працює лише в тому випадку, якщо у вас всього дві команди. Хоча ви можете піти від цього більше двох, він починає неефективно.

Інший спосіб полягає в поєднанні двох текстур - перша є базовою текстурою моделі, друга - кольоровим накладом, яку можна створити під час виконання.

Третім способом може бути зміна кольору базової моделі і не мати текстур (або частково прозорих текстур) над тими частинами моделі, які потрібно показати командним кольорам.


2

Призначення альфа-каналу текстури кольором команди робить текстури DXT в 2 рази більшими, тому я б скоріше скористався клавішею кольоровості для обчислення кольору команди. Позначте один колір (наприклад, зелений, синій, пурпуровий) як "зарезервований колір" у ваших текстурах.

Коли двигун завантажується, зробіть матрицю для кожного кольору команди, який обертає "зарезервований колір" на командний колір. Перед тим, як намалювати командний об'єкт, встановіть цю матрицю як константу пікселя.

У піксельному шейдері перетворіть колір пікселів за командною кольоровою матрицею. Розріжте непроформований колір пікселя з перетвореним кольором пікселів на величину, пропорційну куту кольоровості пікселя та кольоровості "зарезервованого кольору".

Це коштуватиме вам декількох інструкцій ALU та активації в піксельній шейдері, але це набагато дешевше, ніж роздуття кеш текстури з текстурами в 2 рази більше.

Також у вас є можливість мати декілька кольорових клавіш (наприклад, пурпуровий та блакитний кольори, відображені на основний та вторинний кольоровий колір), не присвячуючи одному каналу текстури для кожного кольору.


1

Моя техніка: 2 текстури: одна основна текстура, одна друга текстура, яка накладає основні, але лише ті частини, які ви хочете забарвити. Змініть колір другої текстури, як хочете.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.