c# – 使用不同大小的像素着色器采样器创建WPF效果
我想创建一个效果,我使用一个非常大的图像通过
WPF效果生成一个较小的HLSL图像.但似乎WPF由于某种原因将所有输入图像调整为渲染大小,这不是我想要的,因为它将裁剪我的一个图像并使我的最终图像看起来不那么好.
这就是我设置它的方式. 但是由于源的大量裁剪,所得到的图像非常像素化. 有没有人知道是否有办法让WPF不裁剪像素着色器样本? 我发现Greg Schecter写的这篇博文有点做我想做的事,但反过来说: 解决方法
在WPF Visual中你无法做任何事情,因为如果你的图像源比渲染大小更大,WPF PixelShader会失去质量.如果图像源的大小小于渲染大小,则可以使用PaddingTop,PaddingBottom,PaddingLeft和PaddingRight.只有一个方向,可以帮助您节省全部质量:
使用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是源图像的大小通过这种方式您可以调整输入图像的大小而不会丢失质量 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |