这就是我设置它的方式.
我有一个在MediaElement中播放的大小为2592×1944的图像(视频).
我将我的效果应用于大小为800×600的边框(或其他元素),并将MediaElement绑定到效果,以便能够将要渲染的曲面(边框)和要渲染的源(MediaElement)发送到像素着色器.
但是由于源的大量裁剪,所得到的图像非常像素化.
有没有人知道是否有办法让WPF不裁剪像素着色器样本?
我发现Greg Schecter写的这篇博文有点做我想做的事,但反过来说:
http://blogs.msdn.com/b/greg_schechter/archive/2008/09/27/a-more-useful-multi-input-effect.aspx
他缩小了一个图像,但我想让它更大.问题是他使用的是ImageBrush,因为我使用的是UIElements而不是图像,所以我得到了一个VisualBrush.不知道是否有办法在VisualBrush上做他做的事情.
解决方法
使用Image或ImageBrush并将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是源图像的大小通过这种方式您可以调整输入图像的大小而不会丢失质量
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。