Atualmente, estou trabalhando em um jogo 2D, e minha tarefa atual é descrever o objeto selecionado.
Basicamente, uso um shader de desfoque para fazê-lo em tempo de execução total. Primeiro, desenho meu sprite usando um sombreador de desfoque gaussiano vertical, depois o desenho com um sombreador de desfoque gaussiano horizontal e depois desenho meu sprite normalmente.
Aqui está o meu shader 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 são as compensações que permitem testar os pixels de arredondamento. SampleWeights são pesos calculados com a função gaussiana ( http://en.wikipedia.org/wiki/Gaussian_blur )
Aqui está o resultado:
Não é tão ruim, bastante suave, mas não é visível o suficiente no jogo ... Mas eu gostaria de poder controlar a espessura (para aumentá-la) e adicionar um primeiro contorno opaco antes de desbotá-la em alfa (para mais visível). E eu sinto que o borrão gaussiano talvez não seja tão bom quanto eu pensava na minha tarefa :)
Outra idéia é gerá-lo automaticamente a partir do .png (usando um script do photoshop para torná-lo automático). Eu só preciso preencher os pixels do contorno com uma cor personalizada, armazenando o valor alfa no componente Vermelho, por exemplo, e definir todos os outros componentes como 0. Então, só preciso aplicar um sombreador que substitua os pixels transparentes pela cor desejada
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;
}
}
O problema é que estou usando a compressão DXT5 para o meu sprite, então não tenho certeza de que a cor do shader será exatamente a mesma que escrevi. É por isso que eu nem tentei ... Alguma idéia?
Qualquer conselho seria bem vindo :)