纹理过滤 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
我们正在将用 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