Use alpha to coverage and alpha test for text;

This commit is contained in:
bjorn 2018-10-25 16:15:41 -07:00 committed by Bjorn Swenson
parent bfeb3d2d51
commit a06734ae97
4 changed files with 18 additions and 3 deletions

View File

@ -889,15 +889,14 @@ void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAl
lovrGraphicsMatrixTransform(transform);
lovrGraphicsScale(scale, scale, scale);
lovrGraphicsTranslate(0, offsety, 0);
lovrGraphicsPushPipeline();
state.pipelines[state.pipeline].depthWrite = false;
state.pipelines[state.pipeline].alphaCoverage = true;
lovrGraphicsDraw(&(DrawCommand) {
.shader = SHADER_FONT,
.textures[TEXTURE_DIFFUSE] = font->texture,
.mode = MESH_TRIANGLES,
.range = { 0, vertexCount }
});
lovrGraphicsPopPipeline();
state.pipelines[state.pipeline].alphaCoverage = false;
lovrGraphicsPop();
}

View File

@ -93,6 +93,7 @@ typedef struct {
} Camera;
typedef struct {
bool alphaCoverage;
Color backgroundColor;
BlendMode blendMode;
BlendAlphaMode blendAlphaMode;

View File

@ -47,6 +47,7 @@ typedef enum {
static struct {
Texture* defaultTexture;
bool alphaCoverage;
BlendMode blendMode;
BlendAlphaMode blendAlphaMode;
bool culling;
@ -629,6 +630,9 @@ void lovrGpuInit(bool srgb, getGpuProcProc getProcAddress) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
state.srgb = srgb;
state.alphaCoverage = false;
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
state.blendMode = BLEND_ALPHA;
state.blendAlphaMode = BLEND_ALPHA_MULTIPLY;
glBlendEquation(GL_FUNC_ADD);
@ -682,6 +686,16 @@ void lovrGpuDestroy() {
void lovrGpuBindPipeline(Pipeline* pipeline) {
// Alpha Coverage
if (state.alphaCoverage != pipeline->alphaCoverage) {
state.alphaCoverage = pipeline->alphaCoverage;
if (state.alphaCoverage) {
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
} else {
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
}
}
// Blend mode
if (state.blendMode != pipeline->blendMode || state.blendAlphaMode != pipeline->blendAlphaMode) {
state.blendMode = pipeline->blendMode;

View File

@ -137,6 +137,7 @@ const char* lovrFontFragmentShader = ""
" float sdf = median(col.r, col.g, col.b); \n"
" float w = fwidth(sdf); \n"
" float alpha = smoothstep(.5 - w, .5 + w, sdf); \n"
" if (alpha <= 0.0) discard; \n"
" return vec4(graphicsColor.rgb, graphicsColor.a * alpha); \n"
"}";