Make mipmap filters other than GL_LINEAR_MIPMAP_LINEAR work

GLTexture would set both the minification and magnification filters
to GL_NEAREST if the texture filter was set to any mipmap filter other
than GL_LINEAR_MIPMAP_LINEAR.
icc-effect-5.14.5
Fredrik Höglund 2014-12-10 20:16:40 +01:00
parent aefadfaa6a
commit ccf1bad426
1 changed files with 27 additions and 19 deletions

View File

@ -306,26 +306,34 @@ void GLTexture::bind()
d->onDamage(); d->onDamage();
} }
if (d->m_filterChanged) { if (d->m_filterChanged) {
if (d->m_filter == GL_LINEAR_MIPMAP_LINEAR) { GLenum minFilter = GL_NEAREST;
// trilinear filtering requested, but is it possible? GLenum magFilter = GL_NEAREST;
if (d->s_supportsFramebufferObjects && d->m_canUseMipmaps) {
glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); switch (d->m_filter) {
glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); case GL_NEAREST:
} else { minFilter = magFilter = GL_NEAREST;
// can't use trilinear, so use bilinear break;
d->m_filter = GL_LINEAR;
glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); case GL_LINEAR:
glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); minFilter = magFilter = GL_LINEAR;
} break;
} else if (d->m_filter == GL_LINEAR) {
glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); case GL_NEAREST_MIPMAP_NEAREST:
glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); case GL_NEAREST_MIPMAP_LINEAR:
} else { magFilter = GL_NEAREST;
// if neither trilinear nor bilinear, default to fast filtering minFilter = d->m_canUseMipmaps ? d->m_filter : GL_NEAREST;
d->m_filter = GL_NEAREST; break;
glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); case GL_LINEAR_MIPMAP_NEAREST:
case GL_LINEAR_MIPMAP_LINEAR:
magFilter = GL_LINEAR;
minFilter = d->m_canUseMipmaps ? d->m_filter : GL_LINEAR;
break;
} }
glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, magFilter);
d->m_filterChanged = false; d->m_filterChanged = false;
} }
if (d->m_wrapModeChanged) { if (d->m_wrapModeChanged) {