diff --git a/shaders/reign.f.glsl b/shaders/reign.f.glsl index dd570d9..ce603c8 100644 --- a/shaders/reign.f.glsl +++ b/shaders/reign.f.glsl @@ -22,6 +22,7 @@ #define ALPHA_BLEND 0 #define ALPHA_TEST 1 #define ALPHA_MAP_BLEND 2 +#define ALPHA_MAP_TEST 3 #if ENGINE == REIGN_ENGINE @@ -180,6 +181,9 @@ void main() { discard; } else if (alpha_mode == ALPHA_MAP_BLEND) { alpha *= texture(alpha_texture, tex_coord).r; + } else if (alpha_mode == ALPHA_MAP_TEST) { + if (texture(alpha_texture, tex_coord).r < 0.8) + discard; } frag_color = vec4(frag_rgb, alpha); diff --git a/src/3d/renderer.c b/src/3d/renderer.c index 0e11434..1226a4e 100644 --- a/src/3d/renderer.c +++ b/src/3d/renderer.c @@ -52,6 +52,7 @@ enum { ALPHA_BLEND = 0, ALPHA_TEST = 1, ALPHA_MAP_BLEND = 2, + ALPHA_MAP_TEST = 3, }; enum draw_phase { @@ -426,7 +427,7 @@ static void render_model(struct RE_instance *inst, struct RE_renderer *r, enum d } if (material->alpha_map) { - glUniform1i(r->alpha_mode, ALPHA_MAP_BLEND); + glUniform1i(r->alpha_mode, mesh->is_transparent ? ALPHA_MAP_BLEND : ALPHA_MAP_TEST); glActiveTexture(GL_TEXTURE0 + ALPHA_TEXTURE_UNIT); glBindTexture(GL_TEXTURE_2D, material->alpha_map); glUniform1i(r->alpha_texture, ALPHA_TEXTURE_UNIT);