From f8ea5906c0ae5ef6fb7800e3f0a05ebf56cdd927 Mon Sep 17 00:00:00 2001 From: Steve Branson Date: Wed, 9 Sep 2020 13:20:57 -0700 Subject: [PATCH] Fix softmax_rgb_blend() when mesh is outside zfar Summary: This fixes two small issues with blending.py:softmax_rgb_blend(): 1) zfar and znear attributes are propagated from the camera settings instead of just using default settings of znear=1.0 and zfar=100.0 2) A check is added to prevent arithmetic overflow in softmax_rgb_blend() This is a fix in response to https://github.com/facebookresearch/pytorch3d/issues/334 where meshes rendererd using a SoftPhongShader with faces_per_pixel=1 appear black. This only occurs when the scale of the mesh is large (vertex values > 100, where 100 is the default value of zfar). This fix allows the caller to increase the value of cameras.zfar to match the scale of her/his mesh. Reviewed By: nikhilaravi Differential Revision: D23517541 fbshipit-source-id: ab8631ce9e5f2149f140b67b13eff857771b8807 --- pytorch3d/renderer/blending.py | 2 +- pytorch3d/renderer/mesh/shader.py | 12 +++- .../test_simple_sphere_outside_zfar_100.png | Bin 0 -> 758 bytes .../test_simple_sphere_outside_zfar_10000.png | Bin 0 -> 5819 bytes tests/test_render_meshes.py | 61 ++++++++++++++++++ 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 tests/data/test_simple_sphere_outside_zfar_100.png create mode 100644 tests/data/test_simple_sphere_outside_zfar_10000.png diff --git a/pytorch3d/renderer/blending.py b/pytorch3d/renderer/blending.py index 3fbdd5c5..4bc4822b 100644 --- a/pytorch3d/renderer/blending.py +++ b/pytorch3d/renderer/blending.py @@ -186,7 +186,7 @@ def softmax_rgb_blend( z_inv = (zfar - fragments.zbuf) / (zfar - znear) * mask # pyre-fixme[16]: `Tuple` has no attribute `values`. # pyre-fixme[6]: Expected `Tensor` for 1st param but got `float`. - z_inv_max = torch.max(z_inv, dim=-1).values[..., None] + z_inv_max = torch.max(z_inv, dim=-1).values[..., None].clamp(min=eps) # pyre-fixme[6]: Expected `Tensor` for 1st param but got `float`. weights_num = prob_map * torch.exp((z_inv - z_inv_max) / blend_params.gamma) diff --git a/pytorch3d/renderer/mesh/shader.py b/pytorch3d/renderer/mesh/shader.py index b0945373..c1b5b791 100644 --- a/pytorch3d/renderer/mesh/shader.py +++ b/pytorch3d/renderer/mesh/shader.py @@ -117,7 +117,11 @@ class SoftPhongShader(nn.Module): cameras=cameras, materials=materials, ) - images = softmax_rgb_blend(colors, fragments, blend_params) + znear = kwargs.get("znear", getattr(cameras, "znear", 1.0)) + zfar = kwargs.get("zfar", getattr(cameras, "zfar", 100.0)) + images = softmax_rgb_blend( + colors, fragments, blend_params, znear=znear, zfar=zfar + ) return images @@ -214,7 +218,11 @@ class SoftGouraudShader(nn.Module): cameras=cameras, materials=materials, ) - images = softmax_rgb_blend(pixel_colors, fragments, self.blend_params) + znear = kwargs.get("znear", getattr(cameras, "znear", 1.0)) + zfar = kwargs.get("zfar", getattr(cameras, "zfar", 100.0)) + images = softmax_rgb_blend( + pixel_colors, fragments, self.blend_params, znear=znear, zfar=zfar + ) return images diff --git a/tests/data/test_simple_sphere_outside_zfar_100.png b/tests/data/test_simple_sphere_outside_zfar_100.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa472368ab3776444748140ed9d1d78fada9f08 GIT binary patch literal 758 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0$>y`C X$n@XjSg|WGJu`T^`njxgN@xNAVH(#s literal 0 HcmV?d00001 diff --git a/tests/data/test_simple_sphere_outside_zfar_10000.png b/tests/data/test_simple_sphere_outside_zfar_10000.png new file mode 100644 index 0000000000000000000000000000000000000000..f53459af0e61fc026f15054929d0ca7d1efaf56a GIT binary patch literal 5819 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