Attualmente sto lavorando a un gioco 2D e il mio compito attuale è delineare l'oggetto selezionato.
Fondamentalmente uso uno shader di sfocatura per farlo completamente in fase di esecuzione. Prima disegno il mio sprite usando uno shader di sfocatura gaussiana verticale, quindi lo disegno con uno shader di sfocatura gaussiana orizzontale, e quindi disegno il mio sprite normalmente.
Ecco il mio blur shader: 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 sono gli offset che mi consentono di testare i pixel di arrotondamento SampleWeights sono pesi calcolati con la funzione gaussiana ( http://en.wikipedia.org/wiki/Gaussian_blur )
Ecco il risultato:
Non è così male, abbastanza liscio, ma non abbastanza visibile nel gioco ... Ma mi piacerebbe essere in grado di controllare lo spessore (per ingrandirlo) e aggiungere un primo contorno opaco prima di sbiadirlo in alpha (per rendere più visibile). E sento che la sfocatura gaussiana non è forse così buona come pensavo per il mio compito :)
Un'altra idea è di generarlo automaticamente dal .png (usando uno script di Photoshop per renderlo automatico). Devo solo riempire i pixel di contorno con un colore personalizzato, archiviando ad esempio il valore alfa nel componente Rosso e impostare tutti gli altri componenti su 0. Quindi devo solo applicare uno shader che sostituisce i pixel trasparenti con il colore che desidero
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;
}
}
Il problema è che sto usando la compressione DXT5 per il mio sprite, quindi non posso essere sicuro che il colore che otterrò nel mio shader sarà esattamente lo stesso che ho scritto. Ecco perché non l'ho nemmeno provato ... Qualche idea?
Qualsiasi consiglio sarebbe il benvenuto :)