Je travaille actuellement sur un jeu 2D, et ma tâche actuelle est de définir l'objet sélectionné.
J'utilise essentiellement un shader de flou pour le faire entièrement en runtime. Je dessine d'abord mon sprite à l'aide d'un shader de flou gaussien vertical, puis je le dessine avec un shader de flou gaussien horizontal, puis je dessine mon sprite normalement.
Voici mon shader de flou: sampler TextureSampler: register (s0);
#define SAMPLE_COUNT 15
float2 SampleOffsets[SAMPLE_COUNT];
float SampleWeights[SAMPLE_COUNT];
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c = 0;
// Combine a number of weighted image filter taps.
for (int i = 0; i < SAMPLE_COUNT; i++)
{
c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
}
return c;
}
SampleOffets sont les décalages me permettant de tester les pixels d'arrondi. Les SampleWeights sont des poids calculés avec la fonction gaussienne ( http://en.wikipedia.org/wiki/Gaussian_blur )
Voici le résultat:
Ce n'est pas si mal, assez lisse, mais pas assez visible dans le jeu ... Mais j'aimerais pouvoir contrôler l'épaisseur (pour l'agrandir), et ajouter un premier contour opaque avant de le fondre en alpha (pour faire plus visible). Et j'ai l'impression que le flou gaussien n'est peut-être pas aussi bon que je le pensais pour ma tâche :)
Une autre idée est de le générer automatiquement à partir du .png (en utilisant un script photoshop pour le rendre automatique). J'ai juste besoin de remplir les pixels du contour avec une couleur personnalisée, en stockant la valeur alpha dans le composant rouge par exemple, et de mettre tous les autres composants à 0. Ensuite, je n'ai qu'à appliquer un shader qui remplace les pixels transparents à la couleur que je veux
float4 PixelShaderFunction2(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 color = tex2D(TextureSampler, texCoord);
float4 newColor = 0;
if (color.a == 0 && color.r != 0)
{
color.a = color.r;
// Blue outline
color.b = 1;
}
}
Le problème est que j'utilise la compression DXT5 pour mon sprite, donc je ne peux pas être sûr que la couleur que j'obtiendrai dans mon shader sera exactement la même que celle que j'ai écrite. C'est pourquoi je ne l'ai même pas essayé ... Des pensées?
Tout conseil serait le bienvenu :)