gpt4 book ai didi

c# - 双线性插值 - DirectX 与 GDI+

转载 作者:太空狗 更新时间:2023-10-29 20:18:18 24 4
gpt4 key购买 nike

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

渲染到与位图尺寸相匹配的视口(viewport)(即无缩放或平移)的简单测试用例确实匹配像素完美(无二进制差异)——但只要图像被缩放向上(放大),我在 5-10% 的像素中得到非常小的差异。差异的大小为 1(偶尔为 2)/256。我怀疑这是由于插值差异造成的。

问题:对于 DX9 正射投影(和身份世界空间),相机垂直并以纹理四边形为中心,期望 DirectX.Direct3D.TextureFilter.Linear 是否合理?使用 System.Drawing.Drawing2D.InterpolationMode.Bilinear 时生成与 GDI+ TextureBrush 填充的矩形/多边形相同的输出设置?

对于这种(放大)情况,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 和软件渲染之间的输出相当接近。

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

关于c# - 双线性插值 - DirectX 与 GDI+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5275358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com