Şu anda bir 2D oyun üzerinde çalışıyorum ve şu anki görevim seçilen nesneyi özetlemek.
Temelde tamamen çalışma zamanı yapmak için bir bulanıklık gölgelendirici kullanıyorum. İlk önce dikey bir gauss bulanıklığı gölgelendiricisi kullanarak hareketli grafiğimi çiziyorum, sonra yatay bir gauss bulanıklığı gölgelendiricisi ile çiziyorum ve sonra hareketli grafiğimi normal şekilde çiziyorum.
İşte bulanıklık gölgelendiricim: 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, yuvarlanan pikselleri test etmeme izin veren ofsetlerdir. SampleWeights, gauss işleviyle hesaplanan ağırlıklardır ( http://en.wikipedia.org/wiki/Gaussian_blur )
İşte sonuç:
O kadar kötü değil, oldukça pürüzsüz, ama oyunda yeterli değil ... Ama kalınlığı kontrol edebilmek (büyütmek için) ve alfada solmadan önce ilk opak anahat eklemek istiyorum (yapmak için) daha görünür). Ve gauss bulanıklığının belki de görevim için düşündüğüm kadar iyi olmadığını hissediyorum :)
Başka bir fikir, .png'den otomatik olarak oluşturmaktır (otomatik hale getirmek için bir photoshop komut dosyası kullanarak). Anahat piksellerini özel bir renkle doldurmam gerekiyor, örneğin Alfa bileşeninde alfa değerini saklıyor ve diğer tüm bileşenleri 0 olarak ayarlıyorum. Sonra sadece istediğim renge şeffaf pikselleri değiştiren bir gölgelendirici uygulamak zorundayım
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;
}
}
Sorun şu ki, sprite için DXT5 sıkıştırma kullanıyorum, bu yüzden gölgelendiricimde alacağım rengin yazdığımla aynı olacağından emin olamıyorum. Bu yüzden denemedim bile ... Herhangi bir düşünce?
Herhangi bir tavsiye memnuniyetle karşılanacaktır :)