WPF PixelShader, чьим входом являются данные ниже UIElement, а не в UIElement - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь создать PixelShader, похожий на корректирующий слой Photoshop. Инвертировать это простой пример, где он генерирует негативное изображение (возврат 1 - пиксель).

Проблема, с которой я столкнулся, заключается в том, что вы присоединяете эффект к элементу UIElement, а используемые пиксели взяты из элемента UIElement (цвет заливки для прямоугольника, источник для изображения). Я хотел бы, чтобы пиксели были ниже UIElement (другие фигуры, изображения и т. Д.). Если UIElement, имеющий эффект, перемещается, он использует пиксели под новым ограничивающим прямоугольником.

Есть ли какая-либо опция, которая есть в UIElement, которая позволяет это? Или какой-нибудь UIElement / Control, который похож на сквозной элемент управления и использует его источник из пикселей ниже? Единственный вариант, который я вижу, - визуализировать изображение под ограничительной рамкой и установить его в качестве источника. Но управлять этим, когда он перемещается или другой элемент вставляется ниже, Эффекты кажутся дорогими. Все мои объекты добавляются в Canvas, поэтому объекты можно вставлять, удалять и перемещать.

Спасибо.

//----------------------------------------
// Pixel Shader
//----------------------------------------
sampler2D implicitInput : register(s0);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 imagePixel = tex2D(implicitInput, uv);

    imagePixel.g = 1 - imagePixel.g;
    imagePixel.b = 1 - imagePixel.b;
    imagePixel.r = 1 - imagePixel.r;

    return imagePixel;
}

<!—I don’t want to have a Source but want the data used below the bounding box 
<Image Name="MyInvertEffect" Width="400" Height="400"
Source="/Images/BlackWihiteGray.png"
        Effect="{StaticResource invertEffect}"
>
</Image>
...