From f5d64c875d763dbddbe6133b802bcef7472fb843 Mon Sep 17 00:00:00 2001 From: NimajnebEC Date: Sat, 22 Oct 2022 15:22:50 +0100 Subject: [PATCH] =?UTF-8?q?Fixed=20MASK=20alpha=20mode=20rendering=20issue?= =?UTF-8?q?s=20=E2=80=A2=20Updated=20get=5Ftrimesh=5Fprops=20to=20copy=20a?= =?UTF-8?q?lphaMode=20for=20PBRMaterial=20=E2=80=A2=20Updated=20mesh.frag?= =?UTF-8?q?=20to=20discard=20fragments=20with=20alpha=20<=3D=20alphaThresh?= =?UTF-8?q?old=20=E2=80=A2=20Added=20new=20define:=20IS=5FMASK=5FALPHA=5FM?= =?UTF-8?q?ODE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyrender/mesh.py | 2 +- pyrender/renderer.py | 10 +++++++--- pyrender/shaders/mesh.frag | 7 +++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pyrender/mesh.py b/pyrender/mesh.py index 36833ea..ebf9236 100644 --- a/pyrender/mesh.py +++ b/pyrender/mesh.py @@ -302,7 +302,7 @@ def _get_trimesh_props(mesh, smooth=False, material=None): occlusionTexture=mat.occlusionTexture, emissiveTexture=mat.emissiveTexture, emissiveFactor=mat.emissiveFactor, - alphaMode='BLEND', + alphaMode=mat.alphaMode, baseColorFactor=mat.baseColorFactor, baseColorTexture=mat.baseColorTexture, metallicFactor=mat.metallicFactor, diff --git a/pyrender/renderer.py b/pyrender/renderer.py index f212907..0485767 100644 --- a/pyrender/renderer.py +++ b/pyrender/renderer.py @@ -564,12 +564,14 @@ def _bind_and_draw_primitive(self, primitive, pose, program, flags): program.set_uniform(b.format('glossiness_factor'), material.glossinessFactor) - # Set blending options + # Set alpha options + glEnable(GL_BLEND) if material.alphaMode == 'BLEND': - glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + elif material.alphaMode == "MASK": + program.set_uniform(b.format('alpha_cutoff'), material.alphaCutoff) + glBlendFunc(GL_ONE, GL_ZERO) else: - glEnable(GL_BLEND) glBlendFunc(GL_ONE, GL_ZERO) # Set wireframe mode @@ -988,6 +990,8 @@ def _get_primitive_program(self, primitive, flags, program_flags): defines['USE_METALLIC_MATERIAL'] = 1 elif isinstance(primitive.material, SpecularGlossinessMaterial): defines['USE_GLOSSY_MATERIAL'] = 1 + if primitive.material.alphaMode == 'MASK': + defines['IS_MASK_ALPHA_MODE'] = 1 program = self._program_cache.get_program( vertex_shader=vertex_shader, diff --git a/pyrender/shaders/mesh.frag b/pyrender/shaders/mesh.frag index 4318762..0b9a795 100644 --- a/pyrender/shaders/mesh.frag +++ b/pyrender/shaders/mesh.frag @@ -67,6 +67,9 @@ struct Material { #ifdef HAS_BASE_COLOR_TEX sampler2D base_color_texture; #endif +#ifdef IS_MASK_ALPHA_MODE + float alpha_cutoff; +#endif #ifdef HAS_METALLIC_ROUGHNESS_TEX sampler2D metallic_roughness_texture; #endif @@ -338,6 +341,10 @@ void main() #ifdef HAS_BASE_COLOR_TEX base_color = base_color * srgb_to_linear(texture(material.base_color_texture, uv_0)); #endif +#ifdef IS_MASK_ALPHA_MODE + // Discard fragment if alpha is less than the cutoff + if (base_color.a <= material.alpha_cutoff) discard; +#endif // Compute specular and diffuse colors vec3 dialectric_spec = vec3(min_roughness);