【问题标题】:GL_LINEAR / GL_NEAREST equivalent in DirectX 11DirectX 11 中的 GL_LINEAR / GL_NEAREST 等效项
【发布时间】:2021-11-30 12:07:08
【问题描述】:

我有一个场景,其中我仅根据其分辨率加载相同的纹理,我在 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;
}

【问题讨论】:

    标签: c++ opengl directx-11 opengl-4


    【解决方案1】:

    您可以找到所有过滤选项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 不使用mipmap,并且所有DirectX 过滤选项都使用mipmap,因此您需要将过滤选项与D3D11_SAMPLER_DESC 中的MinLOD/MaxLOD 参数结合起来(这也是过滤参数的位置位于)。您将它们都设置为 0 以强制仅使用最详细的 mip 级别。

    【讨论】:

    • 谢谢!这非常适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多