GL_LINEAR / GL_NEAREST 相当于 DirectX 11

GL_LINEAR / GL_NEAREST equivalent in DirectX 11

我有一个场景,其中我仅根据其分辨率加载相同的纹理我在 OpenGL 中使用不同的过滤模式,这些是 GL_LINEARGL_NEAREST 等等。例如,对于分辨率低于 128 像素的纹理,我将 GL_TEXTURE_MIN_FILTER 设置为 GL_LINEAR,对于 GL_TEXTURE_MAG_FILTER 我设置 GL_NEAREST。如果纹理分辨率超过 128 像素,那么我将 GL_TEXTURE_MIN_FILTER 设置为 GL_LINEAR_MIPMAP_LINEAR,将 GL_TEXTURE_MAG_FILTER 设置为 GL_LINEAR。一般来说,我有一个问题,在 DirectX 11 中,什么是等效的,否则我的纹理分辨率小于 128 像素会变得模糊。

OpenGL:

DirectX 11:

这是我的代码中的样子,只是这两个 API 的示例。

if (width > 128 || height > 128) {
    min = TextureFilteringMode::LINEAR_MIPMAP_LINEAR;
    mag = TextureFilteringMode::LINEAR;
} else if (width <= 128 || height <= 128) {
    min = TextureFilteringMode::LINEAR;
    mag = TextureFilteringMode::NEAREST;
}

您可以找到所有过滤选项here。 如果您只为 DirectX API 编写代码,您的代码将如下所示:

D3D11_SAMPLER_DESC sampler_desc{};
if (width > 128 || height > 128) {
    sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
    sampler_desc.MinLOD = 0;
    sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; //use all the mipmaps
} else if (width <= 128 || height <= 128) {
    sampler_desc.Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
    sampler_desc.MinLOD = sampler_desc.MaxLOD = 0;
}
//fill the rest of desc

由于 GL_LINEAR/GL_NEAREST GL_TEXTURE_MIN_FILTER 不使用 mipmaps 而所有 DirectX 过滤选项都使用 mipmaps,因此您需要将过滤选项与 MinLOD/MaxLOD 参数结合使用 [=14] =](这也是过滤器参数所在的位置)。您将它们都设置为 0 以强制仅使用最详细的 mip 级别。