DirectX 11纹理滤镜线性/点闪烁

时间:2017-02-11 14:07:54

标签: textures directx-11 sampling flicker

我使用 C ++ Windows 10 x64 上编写了一个小型 DirectX 11 应用程序。 现在我想渲染一些低分辨率纹理(例如16px * 16px),而不会失去它在放大倍率(如Terraria等游戏中)的清晰度。 因此,我看到的唯一选项是使精灵纹理具有高分辨率,或将采样器状态从 D3D11_FILTER_MIN_MAG_MIP_LINEAR 更改为 D3D11_FILTER_MIN_MAG_MIP_POINT 。 前者不是我的选择,因为我想保存视频内存而不是浪费它来获取冗余信息。 但第二种方法会引发一些新问题。 如果我使用这个采样器移动一个带纹理的矩形,我会得到恼人的闪烁。

点:
enter image description here

线性
enter image description here

点:
enter image description here

线性
enter image description here

在考虑之后,我得出的结果是使用 D3D11_FILTER_MIN_MAG_MIP_POINT 将始终导致此闪烁。 下图说明了我如何理解点过滤,并说明了闪烁的原因。 在它上面,可以看到一个水平采样过程,使用点过滤,从一个向右移动的低分辨率纹理矩形。

enter image description here

我没有发布任何代码,因为我认为这个问题与任何特定代码无关,根本无济于事。 所以,如果我对这个假设有误,请告诉你 最后问题是我如何解决这个问题或者剩下哪些替代方案?

2 个答案:

答案 0 :(得分:0)

过滤模式与内存使用没有任何关系。您甚至可以在没有mipmap链的纹理上使用这些过滤模式,但是当目标像素大小使用较低的mip时,过滤效果较差。

最近点过滤可能总是会导致伪影,除非您可以确保完全按照1:1的纹素到像素映射,因此它不是特别有用。

DirectX Tool Kit中的{p> SpriteBatch默认使用D3D11_FILTER_MIN_MAG_MIP_LINEARD3D11_FILTER_MIN_MAG_MIP_LINEAR,这对于2D精灵来说效果最佳。

您可以尝试使用D3D11_FILTER_ANISOTROPIC查看是否可以改善您的方案,但请注意,如果您支持Direct3D Hardware Feature Level 9.1,则必须使用MaxAnisotropy 2。如果您有更高的功能级别,则可以使用D3D11_MAX_MAXANISOTROPY

  

对于现代PC或通用Windows平台(UWP),至少D3D_FEATURE_LEVEL_9_3是合理的,因为9.2和9.1已经很老了。甚至Windows手机也至少是9.3。

答案 1 :(得分:0)

一些想法:

有一种称为bilateral filter的过滤技术,其中的想法是在局部对比度较低的地方模糊更多,在局部对比度较高的地方模糊较少,以保留边缘。可以使用类似的想法(手动)对低分辨率纹理进行上采样...

如果您的纹理看起来低分辨率版本看起来足够好,那么更高的分辨率加上纹理压缩可能适合您。

还有多重采样(MSAA)。也许点采样在启用多重采样时可以接受。请注意,您可能还需要执行/启用多重采样着色,因为如果没有,则像素的所有样本都将具有相同的颜色。