双线性插值 - DirectX 与 GDI+

2024-02-08

我有一个 C# 应用程序,我为其编写了 GDI+ 代码,该代码使用 Bitmap/TextureBrush 渲染来呈现 2D 图像,可以应用各种图像处理函数。该代码是应用程序中模仿现有 DX9 代码的新路径,它们共享一个公共库来执行所有向量和矩阵(例如 ViewToWorld/WorldToView)操作。我的测试台由 DX9 输出图像组成,我将它们与新 GDI+ 代码的输出进行比较。

一个简单的测试用例,渲染到与位图尺寸匹配的视口(即无缩放或平移)does完美匹配像素(无二进制差异) - 但是一旦图像被放大(放大),我就会在 5-10% 的像素中得到非常微小的差异。差异的大小为 1(有时为 2)/256。我怀疑这是由于插值差异造成的。

Question:对于 DX9 正射投影(和身份世界空间),相机垂直且以纹理四边形为中心,预期是否合理DirectX.Direct3D.TextureFilter.Linear http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(MICROSOFT.DIRECTX.DIRECT3D.TEXTUREFILTER);使用时生成与 GDI+TextureBrush 填充的矩形/多边形相同的输出System.Drawing.Drawing2D.InterpolationMode.Bilinear http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.DRAWING.DRAWING2D.INTERPOLATIONMODE);环境?

对于这种(放大)情况,DX9 代码使用此(MinFilter、MipFilter 设置类似):
Device.SetSamplerState(0, SamplerStageStates.MagFilter, (int)TextureFilter.Linear);

GDI+ 路径正在使用:g.InterpolationMode = InterpolationMode.Bilinear;

我认为“双线性插值”是一个相当具体的过滤器定义,但后来我注意到 GDI+ 中还有另一个选项“HighQualityBilinear”(我已经尝试过,没有区别 - 考虑到“添加预过滤”的描述,这是有道理的用于收缩”)

跟进问题:期望 DirectX 和 GDI+ 之间的像素完美输出匹配是否合理(假设传入的所有外部坐标都相等)?如果没有,为什么不呢?

澄清:我使用的图像是使用 Format32bppPArgb 的不透明灰度(R=G=B,A=1)。

最后,我还可以使用许多其他 API(Direct2D、WPF、GDI 等),这个问题通常适用于比较其中任意两个的“等效”双线性插值输出图像的输出。谢谢!


DirectX 主要在 GPU 中运行,DX9 可能会运行着色器。 GDI+ 运行在完全不同的算法上。我认为期望两者能够提供完全像素匹配的输出是不合理的。

我预计 DX9 的质量会比 GDI+ 更好,这比旧的 GDI 进步了一步,但进步不大。长期以来,GDI+ 一直被认为在抗锯齿线以及保持图像缩放质量方面存在问题(这似乎是您的问题)。为了获得与最新一代 GPU 纹理处理类似的质量,您需要转向 WPF 图形。这提供了与 DX 类似的质量。

WPF 还使用 GPU(如果可用)并回退到软件渲染(如果没有 GPU),因此 GPU 和软件渲染之间的输出相当接近。

编辑:虽然这已被选为答案,但这只是解释的早期尝试,并没有真正解决真正的原因。读者可以参考问题评论中的讨论和答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双线性插值 - DirectX 与 GDI+ 的相关文章

随机推荐

  • 无法复制/移动文件名末尾带有空格的文件

    真是太疯狂了 我已经使用 Far 2 0 创建了一个文件 http www farmanager com http www farmanager com 也许您可 以使用其他文件管理器 它的文件名是 C 123 txt 是的 文件路径末尾有
  • 在Android中,有没有办法获取电池电流? [复制]

    这个问题在这里已经有答案了 BatteryManager 类没有电流指标 http developer android com reference android os BatteryManager html http developer
  • 窗口服务的通知图标

    我开发了 win 服务程序 它从本地驱动器读取 Excel 文件 然后将此文件值保存到数据库 现在我想开发一个通知图标 该图标将在之后显示一条消息 Excel 文件已保存在数据库中 我的服务将启动并将 Excel 文件保存到数据库 请给我一
  • 绑定到 TabControl SelectedIndex

    我在页面上有一个选项卡控件 它的项目绑定回我的 ViewModel 它还公开了一个 ActiveTabItemIndex 它绑定 两种方式 到我的 xaml 中的 SelectedIndex 属性 并实现 INotifyPropertyCh
  • 设置闹钟不工作

    我正在使用一个IntentService准备警报并使用setAlarmClock在其中设置闹钟 这IntentService始终在正确的时间运行并设置警报 将显示图标 但警报将工作 100 次中的 99 次 当一个警报失败时 每个警报都会出
  • 新类不显示在参考对象浏览器中

    我在我的类库中添加了一个新类Domain called SongPlayDaily cs但由于某种原因 它没有显示在我的参考对象浏览器中 查看图像和相关数字 观察到新班级存在于我的Domain类库 看到我在我的中引用了这个类库Unearth
  • 具有多个不同类型的 ConfigurationElement 的 ConfigurationElementCollection

    是否可以拥有一个包含许多不同类型的集合元素的 Collection ElementCollection 例如
  • Python中按相同属性对对象列表进行分组和求和的最简洁方法是什么

    我有一个 C 类型的对象列表 其中 C 类型由属性 X Y Z 组成 例如 c X c Y c Z 现在我想执行以下任务 对属性 Y 具有相同值的那些对象的属性 Z 进行求和 输出元组列表 Y 与此 Y 的 Z 之和 最简洁的方法是什么 T
  • 为什么静态字段(不是final)在java的内部类中受到限制[重复]

    这个问题在这里已经有答案了 可能的重复 为什么Java禁止内部类中的静态字段 https stackoverflow com questions 1953530 why does java prohibit static fields in
  • 是否可以查看 Eclipse 正在执行哪些 shell 命令?

    我正在处理一个相当长的项目 它需要旧的 JDK 才能正确编译 需要各种 JAR 包含等 我正在使用批处理脚本组装整个项目 并且我希望使用该脚本使整个过程完全自动化 所以我想知道是否可以查看 Eclipse 执行的 shell 命令 将一段特
  • 在添加/删除 ENV 变量时,Elastic Beanstalk 导致我的 Rails 6 应用程序预编译资产损坏

    我可以使代码部署没有问题 一切正常 问题是当我使用 Elastic Beanstalk Web 配置表单或 EB CLI 添加 删除 修改 ENV 变量时 Elastic Beanstalk 报告更改已成功完成 但是当我在浏览器中访问 We
  • 对于使用`type()`构造的类型,mypy“作为类型无效”

    mypy 抱怨error Variable packagename Foo is not valid as a type Foo type Foo Bar Optional Foo 可以通过将类型定义为类来修复此错误 class Foo p
  • php var_dump($object) 或 print_r($object) 到日志文件

    这个问题是通用的 我只是想知道如何将对象转储到日志文件 为了澄清事情 我通过一个例子来阐述 我已经成功地使用 magento 观察者在某些事件发生时调用方法 例如 我正在观察何时通过以下方式保存货件
  • Google 脚本和 AWS SDK

    我想通过 GoogleScript 中的代码与 Google Sheet 中的 Amazon Web Services DynamoDB 进行交互 但是 我不知道如何集成AWS SDK 我希望避免编写一个库来通过 AWS HTTP API
  • python中水平方向的物理拉伸图

    我想要一个使用 matplotlib 创建的简单 x y 图 并在 x 方向上进行物理拉伸 目的是获得让我更容易检测信号中的特征的结果 所以我不想改变任何尺度 值或限制 只需更改输出文件中两个网格点之间的距离 我想在四个子图上这样做 之后它
  • 使用 Pandas groupby 连接多行字符串并从逗号分隔的单元格中删除重复项

    我有以下数据并尝试按唯一 id 进行聚合 并且需要在各自列的一个单元格中获取唯一名称 唯一产品 唯一价格 Unique id Name Product Price 101 ABC Ltd A 100 102 JKL Ltd B 200 10
  • Pygame 的基本网络

    我需要为 Pygame 项目做一些基本的网络工作 基本上 它是一款 2D 单人或合作游戏 网络只需要支持两个玩家 其中一个作为主机 唯一需要发送的信息是玩家 小兵和子弹的位置 我一直在阅读并Twisted https en wikipedi
  • 使用指向本地 p2 存储库的 tycho 构建本地 eclipse 插件

    我正在创建一些需要第三方插件和功能的 Eclipse 插件和功能 为了将这些依赖项包含到我的项目中 我创建了一个 p2 布局存储库 注意 我的 p2 工件不是 Maven 项目 但是 我正在使用 Maven 风格构建 这是 p2 存储库的
  • 如何在 Nuxt 中设置 SASS/SCSS/sass-loader

    我有一个 Nuxt 应用程序 我想使用 CSS 预处理器 我安装了sass loader纤维依赖性 但安装后 应用程序控制台中会出现一条消息 我在图像和代码中显示了该消息 这是代码错误 WARN email protected cdn cg
  • 双线性插值 - DirectX 与 GDI+

    我有一个 C 应用程序 我为其编写了 GDI 代码 该代码使用 Bitmap TextureBrush 渲染来呈现 2D 图像 可以应用各种图像处理函数 该代码是应用程序中模仿现有 DX9 代码的新路径 它们共享一个公共库来执行所有向量和矩