¿Cómo colorear ciertas partes de un modelo, como los juegos RTS tienen esos colores de equipo?

16

Necesito implementar algo que vemos en los juegos de estrategia en tiempo real: colores del equipo. Básicamente, estoy buscando una manera de colorear ciertas partes de un modelo. ¿Cómo lograría esto? No tengo ni idea de por dónde empezar. ¿Necesito hacer algunos ajustes al modelo 3D primero?

rFactor
fuente

Respuestas:

18

La forma en que haría esto se basa en los mapas de textura que está aplicando a las unidades. Para la mayoría de las cosas, tendrá algunas regiones que deben teñirse y otras que no. Entonces, por ejemplo, es posible que tenga un tanque normal, pero solo desea cambiar el color de algunas banderas.

Si pinta la textura como si las regiones coloreadas fueran en escala de grises, puede usar el canal alfa para designar qué regiones deben colorearse.

Entonces, en su sombreador, podría ir (de la manera más simple):

float3 finalColor;
if (colorFromTex.a > 0)
 finalColor = colorFromTex.rgb;
else
 finalColor = colorFromTex.rgb*myTintColor.rgb;

Sin embargo, eso no es óptimo, ya que tendrás una transición difícil y tendrás una rama en tu sombreador. En cambio, es mejor ir:

float3 finalColor = lerp(colorFromTex.rgb, 
    colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);
Lucas
fuente
¿Sabes cómo llevar el sombreador DirectX a los modelos 3D en 3ds Max? Cuando intenté establecer un material con un tipo de sombreador y configuré el sombreador en ReemplazarColor.fx y exporté el modelo, el resultado fue Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". No entiendo cómo puedo hacer eso correcto.
rFactor
¿Es eso cuando lo cargas? Parece extraño que la ruta en el FBX apunte a una carpeta temporal. ¿Existe ese archivo? No estoy muy familiarizado con la exportación de FBX desde 3ds Max, pero tal vez necesite editar los archivos (o configurar una opción) para que las rutas sean relativas.
Lucas
Buena técnica, pero si está utilizando el canal alfa para denotar "tintabilidad", no olvide restablecer el componente alfa en su color final.
charstar
3

Una técnica es tener dos conjuntos de texturas para cada modelo: uno rojo y otro azul. Luego, dependiendo del equipo al que se le asigne el personaje, aplicará ese conjunto de texturas.

Obviamente, esto solo funciona si solo tienes dos equipos. Si bien puede salirse con la suya por más de dos, comienza a ser ineficiente.

Otra forma es mezclar dos texturas: la primera es la textura base para el modelo, la segunda es una superposición de colores que puede generar en tiempo de ejecución.

Una tercera forma podría ser cambiar el color del modelo base y no tener texturas (o texturas parcialmente transparentes) sobre aquellas partes del modelo que desea mostrar los colores del equipo.

ChrisF
fuente
2

Dedicar un canal alfa de textura al color del equipo hace que las texturas DXT sean 2 veces más grandes, por lo que preferiría usar la clave de croma para calcular el color del equipo. Designe un color (por ejemplo, verde, azul, magenta) como el "color reservado" en sus texturas.

Cuando el motor arranque, haga una matriz para cada color del equipo que rote el "color reservado" sobre el color del equipo. Justo antes de dibujar un objeto de equipo, establezca esta matriz como una constante de sombreador de píxeles.

En el sombreador de píxeles, transforme el color del píxel por la matriz de colores del equipo. Cambie el color del píxel sin transformar con el color del píxel transformado, en una cantidad proporcional al ángulo del croma del píxel con respecto al croma del "color reservado".

Esto le costará algunas instrucciones ALU y trigonometría en el sombreador de píxeles, pero eso es mucho más barato que inflar su caché de texturas con texturas 2 veces más grandes.

También tiene la capacidad de tener múltiples teclas de croma (por ejemplo, magenta y cian se asignan a un color de equipo primario y secundario) sin dedicar un canal de textura a cada color.

bmcnett
fuente
1

Mi técnica sería: Tener 2 texturas: una textura principal, una segunda textura superpuesta a la principal pero solo las partes que desea colorear. Cambia el color de la segunda textura como quieras.

daemonfire300
fuente