我有一个C#应用程序,其中我编写了使用位图/纹理刷渲染的GDI+代码来呈现2D图像,可以应用各种图像处理功能。这段代码是模仿现有DX9代码的应用程序中的新路径,并且它们共享一个常见库来执行所有矢量和矩阵(例如ViewToWorld / WorldToView)操作。我的测试床由与新的GDI+代码输出进行比较的DX9输出图像组成。
在视口渲染到匹配位图尺寸的简单测试用例中(即没有缩放或平移),匹配像素完美(没有二进制差异)-但是一旦图像被放大(放大),我在5-10%的像素中得到非常小的差异。差异的大小为1(偶尔为2)/ 256。我怀疑这是由于插值差异造成的。 问题:对于DX9正交投影(和恒等世界空间),使用垂直和居中于纹理四边形的相机,是否合理地期望DirectX.Direct3D.TextureFilter.Linear在使用System.Drawing.Drawing2D.InterpolationMode.Bilinear设置时生成与GDI+ TextureBrush填充的矩形/多边形相同的输出?
对于这种情况(放大),DX9代码正在使用此代码(MinFilter,MipFilter设置类似):
在视口渲染到匹配位图尺寸的简单测试用例中(即没有缩放或平移),匹配像素完美(没有二进制差异)-但是一旦图像被放大(放大),我在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+之间匹配像素完美的输出(假设所有传递的外部坐标相等)?如果不是,为什么?
澄清:我使用的图像是不透明的灰度图(R = G = B,A = 1),使用Format32bppPArgb。
最后,我还可以使用其他的API(例如Direct2D、WPF、GDI等)- 这个问题通常适用于在这些API中比较“相当”的双线性插值输出图像的输出。谢谢!