From 8462beef00ddec2600e743daf2b39b7817649071 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 28 Dec 2021 21:04:20 +0200 Subject: [PATCH] Fix/improve alpha cutoff; The current flag did not work because float shader flags are not supported. It was also not very useful because it was per-shader and did not use the alpha cutoff property of glTF materials. Instead, let's turn the shader flag into an enable/disable boolean, and add a scalar material property named "alphacutoff" that gets read by the glTF importer. When the alphaCutoff flag is enabled, the material property will be compared against the pixel's alpha value to decide whether it should get discarded. --- src/api/l_graphics.c | 1 + src/modules/data/modelData.h | 1 + src/modules/data/modelData_gltf.c | 3 +++ src/modules/graphics/material.c | 2 +- src/resources/shaders.c | 6 ++++-- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/api/l_graphics.c b/src/api/l_graphics.c index 0fb52a16..89f1af6f 100644 --- a/src/api/l_graphics.c +++ b/src/api/l_graphics.c @@ -132,6 +132,7 @@ StringEntry lovrMaterialColor[] = { StringEntry lovrMaterialScalar[] = { [SCALAR_METALNESS] = ENTRY("metalness"), [SCALAR_ROUGHNESS] = ENTRY("roughness"), + [SCALAR_ALPHA_CUTOFF] = ENTRY("alphacutoff"), { 0 } }; diff --git a/src/modules/data/modelData.h b/src/modules/data/modelData.h index 778f0bec..c58ff547 100644 --- a/src/modules/data/modelData.h +++ b/src/modules/data/modelData.h @@ -58,6 +58,7 @@ typedef struct { typedef enum { SCALAR_METALNESS, SCALAR_ROUGHNESS, + SCALAR_ALPHA_CUTOFF, MAX_MATERIAL_SCALARS } MaterialScalar; diff --git a/src/modules/data/modelData_gltf.c b/src/modules/data/modelData_gltf.c index 2906cf32..a80012d3 100644 --- a/src/modules/data/modelData_gltf.c +++ b/src/modules/data/modelData_gltf.c @@ -688,6 +688,7 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io for (int i = (token++)->size; i > 0; i--, material++) { material->scalars[SCALAR_METALNESS] = 1.f; material->scalars[SCALAR_ROUGHNESS] = 1.f; + material->scalars[SCALAR_ALPHA_CUTOFF] = 0.f; material->colors[COLOR_DIFFUSE] = (Color) { 1.f, 1.f, 1.f, 1.f }; material->colors[COLOR_EMISSIVE] = (Color) { 0.f, 0.f, 0.f, 0.f }; memset(material->images, 0xff, MAX_MATERIAL_TEXTURES * sizeof(uint32_t)); @@ -729,6 +730,8 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source, ModelDataIO* io material->colors[COLOR_EMISSIVE].r = NOM_FLOAT(json, token); material->colors[COLOR_EMISSIVE].g = NOM_FLOAT(json, token); material->colors[COLOR_EMISSIVE].b = NOM_FLOAT(json, token); + } else if (STR_EQ(key, "alphaCutoff")) { + material->scalars[SCALAR_ALPHA_CUTOFF] = NOM_FLOAT(json, token); } else if (STR_EQ(key, "name")) { gltfString name = NOM_STR(json, token); map_set(&model->materialMap, hash64(name.data, name.length), model->materialCount - i); diff --git a/src/modules/graphics/material.c b/src/modules/graphics/material.c index 439f7938..3bab4239 100644 --- a/src/modules/graphics/material.c +++ b/src/modules/graphics/material.c @@ -21,7 +21,7 @@ Material* lovrMaterialCreate() { material->ref = 1; for (int i = 0; i < MAX_MATERIAL_SCALARS; i++) { - material->scalars[i] = 1.f; + material->scalars[i] = i == SCALAR_ALPHA_CUTOFF ? 0.f : 1.f; } for (int i = 0; i < MAX_MATERIAL_COLORS; i++) { diff --git a/src/resources/shaders.c b/src/resources/shaders.c index 12cadfca..2b332971 100644 --- a/src/resources/shaders.c +++ b/src/resources/shaders.c @@ -87,6 +87,7 @@ const char* lovrShaderFragmentPrefix = "" "out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n" "uniform float lovrMetalness; \n" "uniform float lovrRoughness; \n" +"uniform float lovrAlphaCutoff; \n" "uniform vec4 lovrDiffuseColor; \n" "uniform vec4 lovrEmissiveColor; \n" "uniform sampler2D lovrDiffuseTexture; \n" @@ -124,7 +125,7 @@ const char* lovrShaderFragmentSuffix = "" "#else \n" " lovrCanvas[0] = color(lovrGraphicsColor, lovrDiffuseTexture, lovrTexCoord); \n" "#ifdef FLAG_alphaCutoff \n" -" if (lovrCanvas[0].a < FLAG_alphaCutoff) { \n" +" if (lovrCanvas[0].a < lovrAlphaCutoff) { \n" " discard; \n" " } \n" "#endif \n" @@ -372,7 +373,8 @@ const char* lovrFillVertexShader = "" const char* lovrShaderScalarUniforms[] = { "lovrMetalness", - "lovrRoughness" + "lovrRoughness", + "lovrAlphaCutoff" }; const char* lovrShaderColorUniforms[] = {