【问题标题】:Creating WPF effects with different sized pixel shader samplers使用不同大小的像素着色器采样器创建 WPF 效果
【发布时间】:2013-09-26 01:04:13
【问题描述】:

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

我就是这样设置的。 我有一个在 MediaElement 中播放的大小为 2592x1944 的图像(视频)。 我将效果应用于大小为 800x600 的边框(或其他元素)并将 MediaElement 绑定到效果,以便能够发送要在(边框)上渲染的表面和要从(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 上所做的事情。

【问题讨论】:

    标签: c# wpf effect pixel-shader


    【解决方案1】:

    在 WPF Visual 中,您不能做任何事情,因为 WPF PixelShader 会丢失质量,如果您的图像源的尺寸大于渲染尺寸。如果您的图像源尺寸小于渲染尺寸,您可以使用PaddingTopPaddingBottomPaddingLeftPaddingRight。只有一种方式,可以帮助您保存 FULL 质量:

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

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

    在 Shader.fs 中:

    float2 ViewAspect : register(C0) = float2(1, 1);
    sampler2D Input : register(s0);
    
    struct VS_OUTPUT
    {
        float4 Position : POSITION;
        float4 Color : COlOR;
        float2 UV : TEXCOORD;
    };
    
    float4 main(VS_OUTPUT input) : COlOR
    {
      float2 uv = input.UV;  
    
        uv.x *= ViewAspect.x;
        uv.y *= ViewAspect.y;
    
        return tex2D(Input, uv);
    }
    

    当你的渲染控件改变你需要的大小时:

            ViewAspectX = ViewWidth > 0 ? FrameWidth / ViewWidth : 1;
            ViewAspectY = ViewHeight > 0 ? FrameHeight / ViewHeight : 1;
    

    ViewWidth и ViewHeight 是渲染 FrameworkElement 的大小,FrameWidth и FrameHeight 是源图像的大小 这样,您可以调整输入图像的大小而不会丢失质量

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多