我使用 C++ 在 Windows 10 x64 上编写了一个小型 DirectX 11 应用程序。 现在我想渲染一些低分辨率纹理(例如 16px * 16px),而不会失去放大倍数的清晰度(在像泰拉瑞亚这样的游戏中如何)。 因此,我看到的唯一选择是使精灵纹理高分辨率或将采样器状态从D3D11_FILTER_MIN_MAG_MIP_LINEAR更改为D3D11_FILTER_MIN_MAG_MIP_POINT。 前者对我来说不是一个选择,因为我想节省视频内存,而不是将其浪费在冗余信息上。 但第二种方法会带来一些新问题。 如果我使用此采样器移动纹理矩形,我会收到恼人的闪烁。
经过思考,我得出的结果是使用 D3D11_FILTER_MIN_MAG_MIP_POINT 总是会导致这种闪烁。 下图说明了我如何理解点过滤,也显示了闪烁的原因。 在它上面,我们可以看到使用点过滤的水平采样过程,从低分辨率纹理矩形向右移动。
我没有发布任何代码,因为我认为这个问题与任何特定代码无关,并且根本没有帮助。
所以如果我的这个假设是错误的,请告诉我。
最后的问题是我该如何解决这个问题或者还有什么替代方案?
过滤模式与内存使用没有任何关系。即使在没有 mipmap 链的纹理上,您也可以使用这些过滤模式,尽管当目标像素大小使用较低的 mip 时过滤效果较差。
最近点过滤可能总是会导致伪影,除非您可以确保精确的 1:1 纹素到像素映射,因此它不是特别有用。
DirectX Tool Kit
中的
SpriteBatch
默认使用 D3D11_FILTER_MIN_MAG_MIP_LINEAR
和 D3D11_FILTER_MIN_MAG_MIP_LINEAR
,这往往最适合 2D 精灵。
您可以尝试使用
D3D11_FILTER_ANISOTROPIC
来查看是否可以改善您的情况,但请记住,如果您支持 Direct3D 硬件功能级别 9.1,则必须使用
MaxAnisotropy
2。如果您有任何更高的功能级别,您可以使用D3D11_MAX_MAXANISOTROPY
。
对于现代 PC 或通用 Windows 平台 (UWP),最小
是合理的,因为 9.2 和 9.1 已经相当旧了。就连Windows Phone也至少是9.3.D3D_FEATURE_LEVEL_9_3