this.DdxUvDdyUvRegisterIndex = 1;
sampler2D ImplicitInput : register(s0);
float facteur : register(c0);
//constante permettant de connaître la distance entre deux pixels
float4 ddxDdy : register(c1);
float4 main(float2 uv : TEXCOORD) : COLOR
{
//Récupération des distances entre deux pixels
float ddx = length(ddxDdy.rg);
float ddy = length(ddxDdy.ba);
//Nombre de pixel sur lequel on applique un filtre (8 voisins du pixel central)
const int n = 9;
//tableau des distances des pixels voisins
const float2 k[n] = {
float2(-ddx, ddy),
float2( 0.0 , ddy),
float2( ddx, ddy),
float2(-ddx, 0.0 ),
float2( 0.0, 0.0),
float2( ddx, 0.0 ),
float2(-ddx, -ddy),
float2( 0.00 , -ddy),
float2( ddx, -ddy),
};
//tableau des coefficients d'un filtre de type Laplacien (on multiplie par -8 le pixel central)
float coef[n] = {-1,0,-1,0,4,0,-1,0,-1};
//Déclaration du tableau des couleurs des pixels voisins
float4 pix[n];
//Déclaration de la variable i pour effectuer les boucles
int i;
//Récupération dans le tableau pix de toutes les valeurs des pixels voisins
for (i=0; i < n; i++) {
pix[i] = tex2D(ImplicitInput, uv + k[i]);
}
//Déclaration de la couleur permettant de recueillir l'application du filtre de type laplacien
float4 couleur = 0;
//calcul de la valeur du pixel par filtrage
for (i = 0; i < n; i++) {
couleur.rgb += dot(pix[i].rgb, coef[i]);
//Renvoie la texture originale si facteur = 1
//Renvoie le laplacien si facteur = 0
//Entre 0 et 1, nous avons les intermédiaires (effet intéressant lors d'animations WPF)
return pix[4] * facteur + (couleur * (1- facteur));
public class MyEffect : ShaderEffect
public MyEffect()
this.PixelShader = _pixelShader;
UpdateShaderValue(ImplicitInputProperty);
UpdateShaderValue(FacteurProperty);
private static PixelShader _pixelShader = new PixelShader()
{ UriSource = new Uri(@"pack://application:,,,/MyEffect;component/MyEffect.ps") };
public static readonly DependencyProperty ImplicitInputProperty =
ShaderEffect.RegisterPixelShaderSamplerProperty("ImplicitInput", typeof(MyEffect), 0);
public Brush ImplicitInput
get { return (Brush)GetValue(ImplicitInputProperty); }
set { SetValue(ImplicitInputProperty, value); }
public static readonly DependencyProperty FacteurProperty = DependencyProperty.Register(
"Facteur", typeof(double), typeof(MyEffect),
new UIPropertyMetadata(0.0, PixelShaderConstantCallback(0), CoerceFacteur)
);
private static object CoerceFacteur(DependencyObject dpdObj, object valeur)
MyEffect effect = dpdObj as MyEffect;
double facteur = 0;
if (effect != null && double.TryParse(valeur.ToString(), out facteur))
if (facteur < 0.0 || facteur > 1.0)
return effect.Facteur;
return facteur;