| 13 | ) |
| 14 | |
| 15 | def render_mesh(verts, faces): |
| 16 | device = verts[0].get_device() |
| 17 | N = len(verts) |
| 18 | num_verts_per_mesh = [] |
| 19 | for i in range(N): |
| 20 | num_verts_per_mesh.append(verts[i].shape[0]) |
| 21 | verts_rgb = torch.ones((N, np.max(num_verts_per_mesh), 3), |
| 22 | requires_grad=False, device=device) |
| 23 | for i in range(N): |
| 24 | verts_rgb[i, num_verts_per_mesh[i]:, :] = -1 |
| 25 | textures = Textures(verts_rgb=verts_rgb) |
| 26 | |
| 27 | meshes = Meshes(verts=verts, |
| 28 | faces=faces, |
| 29 | textures=textures) |
| 30 | elev = torch.rand(N) * 30 - 15 |
| 31 | azim = torch.rand(N) * 360 - 180 |
| 32 | R, T = look_at_view_transform(dist=2, elev=elev, azim=azim) |
| 33 | cameras = FoVPerspectiveCameras(device=device, R=R, T=T) |
| 34 | sigma = 1e-4 |
| 35 | raster_settings = RasterizationSettings( |
| 36 | image_size=128, |
| 37 | blur_radius=np.log(1. / 1e-4 - 1.)*sigma, |
| 38 | faces_per_pixel=40, |
| 39 | perspective_correct=False |
| 40 | ) |
| 41 | renderer = MeshRenderer( |
| 42 | rasterizer=MeshRasterizer( |
| 43 | cameras=cameras, |
| 44 | raster_settings=raster_settings |
| 45 | ), |
| 46 | shader=SoftSilhouetteShader() |
| 47 | ) |
| 48 | return renderer(meshes) |