Зараз я працюю над 2D грою, і моє поточне завдання - окреслити вибраний об’єкт.
Я в основному використовую шейдер для розмиття, щоб зробити це повністю виконуваним. Спочатку малюю спрайт за допомогою вертикальної шейдера розмиття, потім малюю горизонтальним гауссовим шейдером розмиття, а потім малюю спрайт нормально.
Ось мій шейдер розмиття: 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 є заліками , що дозволяють мені тест округлення пікселів SampleWeights є вагами обчислюють з гауссовой функцією ( http://en.wikipedia.org/wiki/Gaussian_blur )
Ось результат:
Це не так вже й погано, досить гладко, але недостатньо помітно в грі ... Але я хотів би мати можливість контролювати товщину (щоб зробити її більшою) та додати перший непрозорий контур перед тим, як затухати в альфа (щоб зробити це видніше). І я відчуваю, що розмитість Гаусса - це, можливо, не так добре, як я думав для свого завдання :)
Інша ідея - це генерувати його автоматично з .png (використовуючи сценарій Photoshop, щоб зробити його автоматичним). Мені просто потрібно заповнити контури пікселів спеціальним кольором, зберігаючи, наприклад, значення альфа в компоненті Червоний, а всі інші компоненти встановити на 0. Потім мені просто потрібно застосувати шейдер, який замінює прозорі пікселі на потрібний колір
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;
}
}
Проблема полягає в тому, що я використовую стиснення DXT5 для свого спрайту, тому я не можу бути впевнений, що колір, який я отримаю в моєму шейдері, буде таким же, як я написав. Тому я навіть цього не пробував ... Будь-які думки?
Будь-яка порада буде вітатися :)