DirectX 11 纹理过滤器线性/点闪烁

问题描述 投票:0回答:3

我使用 C++Windows 10 x64 上编写了一个小型 DirectX 11 应用程序。 现在我想渲染一些低分辨率纹理(例如 16px * 16px),而不会失去放大倍数的清晰度(在像泰拉瑞亚这样的游戏中如何)。 因此,我看到的唯一选择是使精灵纹理高分辨率或将采样器状态从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

我没有发布任何代码,因为我认为这个问题与任何特定代码无关,并且根本没有帮助。 所以如果我的这个假设是错误的,请告诉我。
最后的问题是我该如何解决这个问题或者还有什么替代方案?

textures directx-11 sampling flicker
3个回答
0
投票

过滤模式与内存使用没有任何关系。即使在没有 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),最小

D3D_FEATURE_LEVEL_9_3
是合理的,因为 9.2 和 9.1 已经相当旧了。就连Windows Phone也至少是9.3.


0
投票

一些想法:

有一种称为“双边过滤器”的过滤技术,其想法是在局部对比度较低的地方进行更多模糊处理,在局部对比度较高的情况下进行较少的模糊处理,以保留边缘。可能可以使用类似的想法(手动)对低分辨率纹理进行上采样... 如果您的纹理低分辨率版本看起来足够好,那么高分辨率加上

纹理压缩

可能适合您。 还有

多重采样

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


0
投票

https://www.shadertoy.com/view/ltBGWc

简短的介绍要点:

https://gist.github.com/d7samurai/9f17966ba6130a75d1bfb0f1894ed377

在上下文中,完整的精灵渲染器:

https://gist.github.com/d7samurai/e51adec8a440126d028b87406556079b

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.