c# - 3D WPF 中的最近邻图像采样

标签 c# .net wpf 3d render

我拼命尝试使用最近邻采样将图像渲染到 WPF 中的 3D 表面上。以下是我目前拥有的所有模糊示例。 ImageBrush 被赋予一个 64x64 纹理。

Sample image.

我尝试用 RenderOptions.BitmapScalingMode="NearestNeighbor"WindowImageBrush 装饰 XAML,但没有成功。我试过编写自定义像素着色器,但无法获得令人满意的结果。甚至似乎我无法从着色器代码中设置纹理采样器的过滤模式。我考虑过变通方法,例如自己放大源纹理,但这仍然会在开始插值到下一个像素的两个边缘处留下伪影。

底线:有什么方法可以在 WPF 中的 3D 模型上实现最近邻图像采样的效果?

最佳答案

刚遇到同样的问题,答案在this thread提供了解决方法。

您可以将 VisualBrush 与图像一起使用,然后 WPF 将遵守图像上的 BitmapScalingMode。您还可以设置 CachingHint(也在 RenderOptions 上),这可能会提高性能(虽然没有测量)。

var image = new Image { Source = new BitmapImage(new Uri("pack://application:,,,/Resources/image.png")) };
RenderOptions.SetCachingHint(image, CachingHint.Cache);
RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor);
var material = new DiffuseMaterial(new VisualBrush(image));

这适用于简单的场景,正如我所说的,我没有衡量性能,但我想 VisualBrush 会伤害更大的东西(与 ImageBrush 相比)。我个人会切换到 Direct3D interop并通过 SharpDX 渲染场景当我遇到那个问题时。

关于c# - 3D WPF 中的最近邻图像采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203959/

相关文章:

c# - 如何使用 C# 在 .png 文件中生成路径?

c# - 如何检查文件锁定?

.net - 检测 Windows 机器是否正在运行病毒扫描程序?

c# - 如何在数据表中的任何所需位置插入行?

c# - WPF 用户控件中的数据绑定(bind)

c# - 如何更新 ASPNetCoreRateLimit lib 的重试后值?

c# - 如何取二维数组的一行?

c# - 构造函数内部或外部的成员初始化

c# - 如何在wpf中添加主题

wpf - 如何将 TargetNullValue 设置为日期?