Saat ini saya sedang mengerjakan game 2D, dan tugas saya saat ini adalah untuk menguraikan objek yang dipilih.
Saya pada dasarnya menggunakan shader blur untuk melakukannya sepenuhnya runtime. Saya pertama-tama menggambar sprite saya menggunakan shader gaussian blur vertikal, kemudian saya menggambarnya dengan shader gaussian blur horizontal, dan kemudian saya menggambar sprite saya secara normal.
Ini shader blur saya: 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 adalah offset yang memungkinkan saya untuk menguji pixel pembulatan SampleWeights adalah bobot yang dihitung dengan fungsi gaussian ( http://en.wikipedia.org/wiki/Gaussian_blur )
Inilah hasilnya:
Ini tidak seburuk itu, cukup halus, tetapi tidak cukup terlihat dalam permainan ... Tapi saya ingin dapat mengontrol ketebalan (untuk membuatnya lebih besar), dan menambahkan garis buram pertama sebelum memudar dalam alpha (untuk membuat lebih terlihat). Dan saya merasa seperti gaussian blur mungkin tidak sebagus yang saya pikirkan untuk tugas saya :)
Gagasan lain adalah membuatnya secara otomatis dari .png (menggunakan skrip photoshop untuk membuatnya otomatis). Saya hanya perlu mengisi garis besar piksel dengan warna kustom, menyimpan nilai alfa di komponen Merah misalnya, dan mengatur semua komponen lain ke 0. Lalu saya hanya perlu menerapkan shader yang menggantikan piksel transparan ke warna yang saya inginkan
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;
}
}
Masalahnya adalah, saya menggunakan kompresi DXT5 untuk sprite saya, jadi saya tidak bisa memastikan warna yang akan saya dapatkan di shader saya akan sama persis dengan yang saya tulis. Itu sebabnya saya bahkan tidak mencobanya ... Ada pikiran?
Setiap saran akan diterima :)