From 059c5d3ef26c1800c6545bb603b2a21a189cf8bd Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 23 Jul 2017 23:22:51 -0700 Subject: [PATCH] Fix bugs with font textures; --- src/graphics/font.c | 1 + src/graphics/shader.c | 2 +- src/graphics/texture.c | 19 +++++++++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/graphics/font.c b/src/graphics/font.c index 293a7ba4..bb9a976b 100644 --- a/src/graphics/font.c +++ b/src/graphics/font.c @@ -50,6 +50,7 @@ Font* lovrFontCreate(FontData* fontData) { // Texture TextureData* textureData = lovrTextureDataGetBlank(font->atlas.width, font->atlas.height, 0x0, FORMAT_RGB); font->texture = lovrTextureCreate(textureData); + lovrTextureSetFilter(font->texture, FILTER_BILINEAR, 1.); lovrTextureSetWrap(font->texture, WRAP_CLAMP, WRAP_CLAMP); return font; diff --git a/src/graphics/shader.c b/src/graphics/shader.c index 033d1958..d088b336 100644 --- a/src/graphics/shader.c +++ b/src/graphics/shader.c @@ -76,7 +76,7 @@ const char* lovrFontFragmentShader = "" " float w = fwidth(sdf); \n" " float alpha = smoothstep(.5 - w, .5 + w, sdf); \n" " if (alpha < .001) { discard; } \n" -" return vec4(graphicsColor.rgb, alpha); \n" +" return vec4(graphicsColor.rgb, graphicsColor.a * alpha); \n" "}"; const char* lovrNoopVertexShader = "" diff --git a/src/graphics/texture.c b/src/graphics/texture.c index 6664623f..2a71bd4c 100644 --- a/src/graphics/texture.c +++ b/src/graphics/texture.c @@ -193,6 +193,7 @@ void lovrTextureGetFilter(Texture* texture, FilterMode* filter, float* anisotrop } void lovrTextureSetFilter(Texture* texture, FilterMode filter, float anisotropy) { + int hasMipmaps = texture->textureData->format.compressed || texture->textureData->mipmaps.generated; lovrGraphicsBindTexture(texture); texture->filter = filter; texture->anisotropy = filter == FILTER_ANISOTROPIC ? anisotropy : 1; @@ -204,14 +205,24 @@ void lovrTextureSetFilter(Texture* texture, FilterMode filter, float anisotropy) break; case FILTER_BILINEAR: - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + if (hasMipmaps) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } break; case FILTER_TRILINEAR: case FILTER_ANISOTROPIC: - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + if (hasMipmaps) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } break; }