Я пытаюсь заставить пиксельный шейдер HLSL для Silverlight работать, чтобы вычесть фоновое изображение из видеоизображения. Может ли кто-нибудь предложить более сложный алгоритм, чем я использую, потому что мой алгоритм работает неправильно?
float Tolerance : register(C1);
SamplerState ImageSampler : register(S0);
SamplerState BackgroundSampler : register(S1);
struct VS_INPUT
{
float4 Position : POSITION;
float4 Diffuse : COLOR0;
float2 UV0 : TEXCOORD0;
float2 UV1 : TEXCOORD1;
};
struct VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR0;
float2 UV : TEXCOORD0;
};
float4 PS( VS_OUTPUT input ) : SV_Target
{
float4 color = tex2D( ImageSampler, input.UV );
float4 background = tex2D( BackgroundSampler, input.UV);
if (abs(background.r - color.r) <= Tolerance &&
abs(background.g - color.g) <= Tolerance &&
abs(background.b - color.b) <= Tolerance)
{
color.rgba = 0;
}
return color;
}
Чтобы увидеть пример этого, вам нужен компьютер с веб-камерой:
- Перейдите на страницу http://xmldocs.net/alphavideo/background.html.
- Нажмите [Начать запись].
- Переместите свое тело за пределы сцены и нажмите [Захват фона].
- Затем переместите свое тело обратно в сцену и с помощью ползунка отрегулируйте значение допуска для шейдера.