-- rendering shape with detail normal map
(self, vertices, transformed_vertices, colors=None, background=None, detail_normal_images=None, lights=None, return_grid=False, uv_detail_normals=None, h=None, w=None)
| 369 | return shading.mean(1) |
| 370 | |
| 371 | def render_shape(self, vertices, transformed_vertices, colors=None, background=None, detail_normal_images=None, lights=None, return_grid=False, uv_detail_normals=None, h=None, w=None): |
| 372 | ''' |
| 373 | -- rendering shape with detail normal map |
| 374 | ''' |
| 375 | batch_size = vertices.shape[0] |
| 376 | if lights is None: |
| 377 | light_positions = torch.tensor( |
| 378 | [ |
| 379 | [-5, 5, -5], |
| 380 | [5, 5, -5], |
| 381 | [-5, -5, -5], |
| 382 | [5, -5, -5], |
| 383 | [0, 0, -5], |
| 384 | ] |
| 385 | )[None, :, :].expand(batch_size, -1, -1).float() |
| 386 | |
| 387 | light_intensities = torch.ones_like(light_positions).float()*1.7 |
| 388 | lights = torch.cat((light_positions, light_intensities), 2).to( |
| 389 | vertices.device) |
| 390 | # normalize z to 10-90 for raterization (in pytorch3d, near far: 0-100) |
| 391 | transformed_vertices = transformed_vertices.clone() |
| 392 | transformed_vertices[:, :, 2] = transformed_vertices[:, |
| 393 | :, 2] - transformed_vertices[:, :, 2].min() |
| 394 | transformed_vertices[:, :, 2] = transformed_vertices[:, |
| 395 | :, 2]/transformed_vertices[:, :, 2].max() |
| 396 | transformed_vertices[:, :, 2] = transformed_vertices[:, :, 2]*80 + 10 |
| 397 | |
| 398 | # Attributes |
| 399 | face_vertices = util.face_vertices( |
| 400 | vertices, self.faces.expand(batch_size, -1, -1)) |
| 401 | normals = util.vertex_normals( |
| 402 | vertices, self.faces.expand(batch_size, -1, -1)) |
| 403 | face_normals = util.face_vertices( |
| 404 | normals, self.faces.expand(batch_size, -1, -1)) |
| 405 | transformed_normals = util.vertex_normals( |
| 406 | transformed_vertices, self.faces.expand(batch_size, -1, -1)) |
| 407 | transformed_face_normals = util.face_vertices( |
| 408 | transformed_normals, self.faces.expand(batch_size, -1, -1)) |
| 409 | if colors is None: |
| 410 | colors = self.face_colors.expand(batch_size, -1, -1, -1) |
| 411 | attributes = torch.cat([colors, |
| 412 | transformed_face_normals.detach(), |
| 413 | face_vertices.detach(), |
| 414 | face_normals, |
| 415 | self.face_uvcoords.expand(batch_size, -1, -1, -1)], |
| 416 | -1) |
| 417 | # rasterize |
| 418 | rendering = self.rasterizer(transformed_vertices, self.faces.expand( |
| 419 | batch_size, -1, -1), attributes, h, w) |
| 420 | |
| 421 | #### |
| 422 | alpha_images = rendering[:, -1, :, :][:, None, :, :].detach() |
| 423 | |
| 424 | # albedo |
| 425 | albedo_images = rendering[:, :3, :, :] |
| 426 | # mask |
| 427 | # transformed_normal_map = rendering[:, 3:6, :, :].detach() |
| 428 | # pos_mask = (transformed_normal_map[:, 2:, :, :] < 0).float() |
no test coverage detected