GL_LINEAR / GL_NEAREST 相当于 DirectX 11
GL_LINEAR / GL_NEAREST equivalent in DirectX 11
我有一个场景,其中我仅根据其分辨率加载相同的纹理我在 OpenGL 中使用不同的过滤模式,这些是 GL_LINEAR
、GL_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 级别。
我有一个场景,其中我仅根据其分辨率加载相同的纹理我在 OpenGL 中使用不同的过滤模式,这些是 GL_LINEAR
、GL_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 级别。