纹理过滤 DirectX 到 WebGL

Texture filtering DirectX to WebGL

我们正在将用 DirectX 9 编写的旧代码移植到 WebGL。我们偶然发现了一个错误,它似乎与纹理过滤有关。

对于某些纹理,原始代码使用了以下内容:

MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = POINT;    
Texture   = <envCube1>;
AddressU  = WRAP;
AddressV  = WRAP;

这对其他人来说:

MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;    
Texture   = <envCube4>;
AddressU  = WRAP;
AddressV  = WRAP;

我知道 MagFilter 是 POINT = NEAREST 和 LINEAR = LINEAR,但是由于 WebGL(和一般的 OpenGL)没有将 MipFilter 与 MinFilter 分开,我不确定哪个是等效的。

鉴于 DX9 的两个采样器状态,OpenGL 等效设置为:

Min Filter: GL_NEAREST_MIPMAP_LINEAR
Mag Filter: GL_LINEAR

Min Filter: GL_NEAREST_MIPMAP_NEAREST
Mag Filter: GL_NEAREST

更笼统地说,您需要遵守一条经验法则。

OpenGL 中的最小过滤器是他们决定在 mip 过滤器上添加的地方,作为一种事后 hack(相当多的 GL 设计相当于快速 hack 以使其适合现有 API 而不引入新的命令或状态)。

任何带有 ..._MIPMAP_... 的过滤器常量仅可用作缩小过滤器并以这种方式读取:

GL_<MipFilter>_MIPMAP_<MinFilter>

你的问题不是问这个,而是考虑以下D3D采样器状态:

MinFilter = POINT
MagFilter = POINT
MipFilter = NONE

这是它的 GL 等效设置:

MinFilter = GL_NEAREST
MagFilter = GL_NEAREST