我有一个 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 等),这个问题通常适用于比较其中任意两个的“等效”双线性插值输出图像的输出。谢谢!