hol*_*olt 7 c# directx 3d gdi+ image-processing
我有一个C#应用程序,我编写了GDI +代码,使用Bitmap/TextureBrush渲染来呈现2D图像,可以应用各种图像处理功能.此代码是模拟现有DX9代码的应用程序中的新路径,它们共享一个公共库以执行所有向量和矩阵(例如ViewToWorld/WorldToView)操作.我的测试床由DX9输出图像组成,我将其与新GDI +代码的输出进行比较.
渲染到与Bitmap尺寸匹配的视口(即没有缩放或平移)的简单测试用例确实匹配像素完美(没有二进制差异) - 但是一旦图像被放大(放大),我就会得到非常小的差异在5-10%的像素中.差异的大小是1(偶尔2)/ 256.我怀疑这是由于插值差异造成的.
问题:对于DX9正射投影(和身份世界空间),相机垂直并以纹理四边形为中心,期望DirectX.Direct3D.TextureFilter.Linear生成相同的输出到GDI + TextureBrush填充矩形/多边形是合理的使用System.Drawing.Drawing2D.InterpolationMode.Bilinear设置?
对于这个(放大)情况,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和软件渲染之间的输出相当接近.
编辑:虽然这已被选为答案,但这只是一个早期尝试解释,并没有真正解决真正的原因.读者可以参考对问题的评论和答案中的讨论.
| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |