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);