使用不同大小的像素着色器采样器创建 WPF 效果

Mar*_*kus 5 c# wpf effect pixel-shader

我想创建一个效果,我使用相当大的图像通过 WPF 效果使用 HLSL 生成较小的图像。但似乎 WPF 出于某种原因将所有输入图像的大小调整为渲染大小,这不是我想要的,因为它会大量裁剪我的一个图像并使我的最终图像看起来不太好。

我就是这样设置的。我有一个在 MediaElement 中播放的大小为 2592x1944 的图像(视频)。我将我的效果应用于大小为 800x600 的边框(或其他元素)并将 MediaElement 绑定到效果,以便能够将要渲染的表面(边框)和要渲染的源(媒体元素)发送到像素着色器。

但是由于源的大量裁剪,生成的图像非常像素化。

有谁知道是否有办法让 WPF 不裁剪像素着色器样本?

我发现 Greg Schecter 的这篇博文有点像我想要的,但反过来:http : //blogs.msdn.com/b/greg_schechter/archive/2008/09/27/a-more-useful-multi- input-effect.aspx 他缩小了一个图像,但我想我想把它放大。问题是他使用 ImageBrush,而我得到了 VisualBrush,因为我使用 UIElements 而不是图像。不知道有没有办法做他在 VisualBrush 上做的事情。

小智 2

在 WPF 中Visual,您无法执行任何操作,因为PixelShader如果图像源的大小大于渲染大小,则 WPF 会损失质量。如果您的图像源的大小小于渲染大小,则可以使用PaddingTopPaddingBottomPaddingLeftPaddingRight只有一种方法可以帮助您保存完整的质量:

\n\n

使用ImageImageBrush并设置StretchNone。通过这种方式,您可以将完整图像(Textura)发送到PixelShader. 您必须具有DependencyPRoperty自定义ShaderEffect

\n\n
public static readonly DependencyProperty ViewAspectProperty = DependencyProperty.Register(nameof(ViewAspect), typeof(Point), typeof(CustomEffect), new UIPropertyMetadata(new Point(1D, 1D), PixelShaderConstantCallback(0)));\n\n    public Point ViewAspect\n    {\n        get => (Point)GetValue(ViewAspectProperty);\n        set => SetValue(ViewAspectProperty, value);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Shader.fs 中:

\n\n
float2 ViewAspect : register(C0) = float2(1, 1);\nsampler2D Input : register(s0);\n\nstruct VS_OUTPUT\n{\n    float4 Position : POSITION;\n    float4 Color : COlOR;\n    float2 UV : TEXCOORD;\n};\n\nfloat4 main(VS_OUTPUT input) : COlOR\n{\n  float2 uv = input.UV;  \n\n    uv.x *= ViewAspect.x;\n    uv.y *= ViewAspect.y;\n\n    return tex2D(Input, uv);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您的渲染控件将更改大小时,您需要:

\n\n
        ViewAspectX = ViewWidth > 0 ? FrameWidth / ViewWidth : 1;\n        ViewAspectY = ViewHeight > 0 ? FrameHeight / ViewHeight : 1;\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中ViewWidth\xd0\xb8ViewHeight是渲染 FrameworkElement 的大小,而FrameWidth\xd0\xb8FrameHeight是源图像的大小通过这种方式,您可以调整输入图像的大小而不会损失质量

\n